我有一个我曾经通过 AppVeyor 构建的项目。构建顺序如下:
- 安装并运行 GitVersion
- 构建项目
- 使用评估的版本号创建包。
最后一步由 PowerShell 命令完成:
nuget pack path/tofile.nuspec -Version (get-item env:GitVersion_InformationalVersion).Value
如您所见,版本取自 GitVersion 定义的环境变量。现在我想将构建迁移到 FAKE 构建脚本。
我在我的脚本中定义了这些依赖项。
"Clean"
=?> ("GitVersion", Choco.IsAvailable)
==> "RestorePackages"
==> "BuildApp"
==> "CreatePackage"
==> "Default"
Git 版本步骤很简单。
Target "GitVersion" (fun _ ->
"gitversion.portable" |> Choco.Install id
Shell.Exec("gitversion","/l console /output buildserver" ) |> ignore
)
我可以在我的日志中看到变量是由 GitVersion 设置的。
添加环境变量。名称='GitVersion_SemVer' 值='1.1.1-xxx'
下一步是创建包。
Target "CreatePackage" (fun _ ->
TraceEnvironmentVariables()
let version =
match buildServer with
| AppVeyor -> environVar "GitVersion_SemVer"
| _ -> baseVersion + "-local"
NuGet (fun p ->
{p with
OutputPath = packagingDir
WorkingDir = "."
Version = version
Publish = false })
nuspecFileName
)
我正在打印所有定义的变量,之后我试图通过读取变量并将其分配给version
.
不幸version
的是,当我运行构建时,它仍然是空的。添加TraceEnvironmentVariables()
方法调用后,我可以看到 GitVersion 定义的变量都没有出现在输出中。
正如 John Palmer 和dustinmoris 所说,流程开始于Shell.Execute
将所有变量设置为流程级变量。
有没有办法Shell.Execute
让进程可以设置全局范围的环境变量?
UPD
作为一种解决方法,我在AppVeyor.yml
配置文件中添加了额外的步骤:
init:
- git config --global core.autocrlf input
install:
- choco install gitversion.portable -y
before_build:
- ps: gitversion /l console /output buildserver /b (get-item env:APPVEYOR_REPO_BRANCH).Value
build_script:
- cmd: build.bat BuildApp
在这种情况下,变量设置在全局范围内,我可以获取它们并在我的构建脚本中使用。
显然,PowerShell 以不同的方式启动 GitVersion。我想,我应该在我的构建脚本中以某种方式模仿它。
所以我的问题还是一样,如何在我的脚本中使用 GitVersion 作为目标并取回版本号。