如何调用外部构建脚本?

时间:2016-03-03 10:30:30

标签: f# f#-fake

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

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

另外,我想将一些参数移交给外部构建脚本,例如版本标签。

这是一些伪代码:

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

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

    ... tagging etc. ...
)

1 个答案:

答案 0 :(得分:1)

模块化构建的常用方法不是通过在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.Exec来执行它作为常规shell命令:

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 file作为参数。要解决这个问题,您需要将fake.exe包装在shell脚本中(两个脚本 - 一个用于Windows,一个用于UNIX),然后将该脚本的名称作为参数传递到FAKE脚本中。