问题主要与步骤3有关。
我需要在F#中实现以下循环:
从数据库加载一些输入参数。如果输入参数指定应终止循环,则退出。感谢类型提供程序。
运行模型生成器,该模型生成器将生成一个F#源文件,并将其命名为ModelData.fs
。生成基于输入参数和一些随机值。这可能需要几个小时。我已经有了。
编译项目。 我可以硬编码对MSBuild的调用,但这感觉不正确。
将可执行文件复制到某个临时文件夹中,例如<SomeTempData>\<SomeModelName>
。
从上一步的输出位置异步运行可执行文件。执行时间通常在几小时到几天之间。每个进程都在单个线程中运行,因为在这种情况下,这是最有效的方式。我尝试了并行版本,但没有击败单线程版本。
执行完成时捕获。这似乎很简单:https://docs.microsoft.com/en-us/dotnet/api/system.diagnostics.process.exited?view=netframework-4.7.2。正在运行的进程负责存储有用的结果(如果有)。此事件可以由F#MailBoxProcessor处理。
从头开始重复。由于执行是异步的,因此请监视正在运行的任务数以确保其数量不超过允许的数量。再次,MailBoxProcessor将轻松做到这一点。
整个过程将在Windows上运行,因此无需维护多个平台。只需NET Framework(截至目前为4.7.2)就可以了。
这似乎是非常简单的类似于CI的练习,而F#FAKE似乎是正确的解决方案。不幸的是,所提供的稀缺示例均无法正常工作(即使进行了合理的调整),并且这些错误是神秘的。但是,最糟糕的部分是编译功能根本不起作用。提供的示例:http://fake.build/fake-gettingstarted.html#Compiling-the-application根本无法运行,即使考虑了类似的情况:https://github.com/fsharp/FAKE/issues/1579:它仍然默默地选择不编译项目。我将不胜感激。
这是我尝试运行的代码。它基于以上参考:
#r @"C:\GitHub\ClmFSharp\Clm\packages\FAKE.5.8.4\tools\FakeLib.dll"
#r @"C:\GitHub\ClmFSharp\Clm\packages\FAKE.5.8.4\tools\System.Reactive.dll"
open System.IO
open Fake.DotNet
open Fake.Core
open Fake.IO
open Fake.IO.Globbing.Operators
let execContext = Fake.Core.Context.FakeExecutionContext.Create false "build.fsx" []
Fake.Core.Context.setExecutionContext (Fake.Core.Context.RuntimeContext.Fake execContext)
// Properties
let buildDir = @"C:\Temp\WTF\"
// Targets
Target.create "Clean" (fun _ ->
Shell.cleanDir buildDir
)
Target.create "BuildApp" (fun _ ->
!! @"..\SolverRunner\SolverRunner.fsproj"
|> MSBuild.runRelease id buildDir "Build"
|> Trace.logItems "AppBuild-Output: "
)
Target.create "Default" (fun _ ->
Trace.trace "Hello World from FAKE"
)
open Fake.Core.TargetOperators
"Clean"
==> "BuildApp"
==> "Default"
Target.runOrDefault "Default"
问题在于它根本不构建项目,但不会产生任何错误消息!这是在FSI中运行时的输出:
run Default
Building project with version: LocalBuild
Shortened DependencyGraph for Target Default:
<== Default
<== BuildApp
<== Clean
The running order is:
Group - 1
- Clean
Group - 2
- BuildApp
Group - 3
- Default
Starting target 'Clean'
Finished (Success) 'Clean' in 00:00:00.0098793
Starting target 'BuildApp'
Finished (Success) 'BuildApp' in 00:00:00.0259223
Starting target 'Default'
Hello World from FAKE
Finished (Success) 'Default' in 00:00:00.0004329
---------------------------------------------------------------------
Build Time Report
---------------------------------------------------------------------
Target Duration
------ --------
Clean 00:00:00.0025260
BuildApp 00:00:00.0258713
Default 00:00:00.0003934
Total: 00:00:00.2985910
Status: Ok
---------------------------------------------------------------------