【问题标题】:How to invoke external build scripts?如何调用外部构建脚本?
【发布时间】:2016-03-03 10:30:30
【问题描述】:

如何从 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. ...
)

【问题讨论】:

  • 为什么需要这样做?更简洁的方法是 #load 另一个脚本并从中调用函数。为您提供打字安全和更多控制。
  • 这听起来像是我原来的问题的合适解决方案。
  • 通过一个小例子将其作为答案发布。

标签: f# f#-fake


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

【讨论】:

  • 我刚刚发现它对我不起作用。我无法#load 外部构建文件,因为构建开始时它不存在。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-18
  • 1970-01-01
  • 1970-01-01
  • 2021-05-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多