我有一个项目,我通过AppVeyor来构建。构建顺序如下:如何使用GitVersion环境变量
- 安装和运行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设置的。
添加环境变量。 name ='GitVersion_SemVer' value ='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作为目标并获取版本号。
基本问题是,当你运行脚本时,它看起来像是有一组不同的环境变量。您可能需要检查shell.exec调用,看看您是否可以在那里访问环境变量 –
hm,这是有道理的,我会试试看。 –