如何调用外部构建脚本?

How to invoke external build scripts?

如何从 FAKE 构建脚本中执行另一个 FAKE 构建脚本?

我想创建一个构建脚本来克隆 git 存储库,然后在克隆的项目中执行构建脚本。之后它应该标记分支并将构建工件发布到 Nexus Repository Manager。

我还想将一些参数传递给外部构建脚本,例如一个版本标签。

这是一些伪代码:

Target "ReleaseBuild" (fun _ ->
    CleanDir "src"
    cloneSingleBranch "" "http://<URL to git-repo>" "master" "src"

    ?????  "src/build.fsx" versionNumer

    ... tagging etc. ...
)

模块化构建的常用方法不是在 FAKE 中调用 FAKE,而是使用 #load 指令让 FSI 加载模块。

例如:

// build.fsx
#r "path/to/FakeLib.dll"
#load "./OtherModule.fsx"
open Fake

Target "ReleaseBuild" <| fun _ ->
    CleanDir "src" 
    cloneSingleBranch "" "http://<URL to git-repo>" "master" "src" 

    OtherModule.DoWhatever versionNumer

...


// OtherModule.fsx

let DoWhatever version =
    ...

.
编辑(回应评论)
如果第一个启动时另一个脚本文件不存在,那么您可以使用 FSIHelper.executeFSI:

执行它
Target "ReleaseBuild" <| fun _ ->
    CleanDir "src" 
    cloneSingleBranch "" "http://<URL to git-repo>" "master" "src" 

    let result, messages = FSIHelper.executeFSI "src" "build.fsx" []

    ...

(或 executeFSIWithArgs 如果你需要传递参数)

如果出于某种原因即使这对您不起作用,我也会将其作为常规 shell 命令执行,使用 Shell.Exec:

Target "ReleaseBuild" <| fun _ ->
    CleanDir "src" 
    cloneSingleBranch "" "http://<URL to git-repo>" "master" "src" 

    let errCode = Shell.Exec ("path/to/fake.exe", args = "src/build.fsx")

    ...

但是如果你希望它是跨平台的,它会变得有点复杂:*.exe 不会在 UNIX 上本地执行,你需要 运行 mono 并给出.exe 文件作为参数。要解决这个问题,您需要将 fake.exe 包装在 shell 脚本中(两个脚本 - 一个用于 Windows,一个用于 UNIX),然后将该脚本的名称传递为FAKE 脚本中的参数。