F#如何实现参数化CI –使用FAKE

时间:2018-12-29 01:32:00

标签: f# f#-interactive f#-fake

问题主要与步骤3有关。

我需要在F#中实现以下循环:

  1. 从数据库加载一些输入参数。如果输入参数指定应终止循环,则退出。感谢类型提供程序。

  2. 运行模型生成器,该模型生成器将生成一个F#源文件,并将其命名为ModelData.fs。生成基于输入参数和一些随机值。这可能需要几个小时。我已经有了。

  3. 编译项目。 我可以硬编码对MSBuild的调用,但这感觉不正确

  4. 将可执行文件复制到某个临时文件夹中,例如<SomeTempData>\<SomeModelName>

  5. 从上一步的输出位置异步运行可执行文件。执行时间通常在几小时到几天之间。每个进程都在单个线程中运行,因为在这种情况下,这是最有效的方式。我尝试了并行版本,但没有击败单线程版本。

  6. 执行完成时捕获。这似乎很简单:https://docs.microsoft.com/en-us/dotnet/api/system.diagnostics.process.exited?view=netframework-4.7.2。正在运行的进程负责存储有用的结果(如果有)。此事件可以由F#MailBoxProcessor处理。

  7. 从头开始重复。由于执行是异步的,因此请监视正在运行的任务数以确保其数量不超过允许的数量。再次,MailBoxProcessor将轻松做到这一点。

  8. 整个过程将在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
---------------------------------------------------------------------

0 个答案:

没有答案