如何在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. ...
)
答案 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脚本中。