如何调用外部构建脚本?
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 脚本中的参数。
如何从 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 脚本中的参数。