2016-04-30 93 views
1

我有一个项目,我通过AppVeyor来构建。构建顺序如下:如何使用GitVersion环境变量

  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设置的。

添加环境变量。 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作为目标并获取版本号。

+0

基本问题是,当你运行脚本时,它看起来像是有一组不同的环境变量。您可能需要检查shell.exec调用,看看您是否可以在那里访问环境变量 –

+0

hm,这是有道理的,我会试试看。 –

回答

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 
+0

谢谢你,这次更新。这位助手在我提出这个问题几个月后才实施。 –

1

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

您将不得不设置永久环境变量,如用户级或机器级环境变量。

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

例子:

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

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

+0

感谢您的意见。 GitVersion是一个自动化你列出的一些操作的工具。稳定版本是手动标记的,其余的是配置和约定驱动。无论如何,我想避免在我的脚本中重新实现这个工具,这就是为什么自己设置变量对我来说不是一个合适的解决方案。 –

+0

好吧,也许我误解了你的问题。它听起来像你已经通过构建你自己的定制的FAKE驱动构建脚本来“重新实现”appveyor.yml。 – dustinmoris

+0

我不想重建GitVersion。但我确实希望保持AppVeyor配置的简短。这就是为什么我要将所有内容都移动到FAKE脚本。 –