2

我有一个我曾经通过 AppVeyor 构建的项目。构建顺序如下:

  1. 安装并运行 GitVersion
  2. 构建项目
  3. 使用评估的版本号创建包。

最后一步由 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 作为目标并取回版本号。

4

2 回答 2

1

您的问题是您创建了一个进程级环境变量。在你存在 shell 进程之后,在不同进程中运行的下一步不知道你在那里设置的任何环境变量。

您将必须设置一个永久环境变量,例如用户级或机器级变量。

查看 .NET 中的Environment.SetEnvironmentVariable方法。

例子:

Environment.SetEnvironmentVariable("key", "value", EnvironmentVariableTarget.Machine);

但是,我认为这不是一个好的解决方案。我不知道 GitVersion,坦率地说不明白你为什么需要这个东西。您的构建脚本不能确定语义版本本身吗?清楚地设置 sem 版本是一个手动步骤,因为没有自动化工具会知道如何根据您的代码更改正确地增加版本。因此,您应该在项目中选择一个位置(1 个文件,如自述文件,或任何其他有意义的文件)来设置您的语义版本,并让所有其他工具从那里读取它以在构建期间设置程序集版本,打包 nuget 包,在 git 中创建标签等。

于 2016-05-01T10:03:56.123 回答
1

你看过 Fake GitVersionHelper 吗?http://fsharp.github.io/FAKE/apidocs/fake-gitversionhelper.html

#r "packages/FAKE/tools/FakeLib.dll"
open Fake
open Fake.GitVersionHelper

let version = GitVersion (id)

printfn "FullSemVer %s" version.FullSemVer
printfn "NuGetVersionV2 %s" version.NuGetVersionV2
于 2016-10-05T08:09:42.477 回答