首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用GitVersion环境变量

如何使用GitVersion环境变量
EN

Stack Overflow用户
提问于 2016-04-30 12:08:43
回答 2查看 2.7K关注 0票数 2

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

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

最后一步由PowerShell命令完成:

代码语言:javascript
复制
nuget pack path/tofile.nuspec -Version (get-item env:GitVersion_InformationalVersion).Value

如您所见,版本是从GitVersion定义的环境变量中提取的。现在,我想将构建迁移到一个假构建脚本。

我在脚本中定义了这些依赖项。

代码语言:javascript
复制
"Clean"
  =?> ("GitVersion", Choco.IsAvailable)
  ==> "RestorePackages"
  ==> "BuildApp"
  ==> "CreatePackage"
  ==> "Default"

Git版本步骤很简单。

代码语言:javascript
复制
Target "GitVersion" (fun _ ->
    "gitversion.portable" |> Choco.Install id
    Shell.Exec("gitversion","/l console /output buildserver" ) |> ignore
)

我可以从日志中看到变量是由GitVersion设置的。

添加环境变量。name='GitVersion_SemVer‘值=’1.1.1-xxx‘

下一步是创建包。

代码语言:javascript
复制
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和dustinmoris所说,Shell.Execute启动的过程将所有变量设置为过程级变量。

是否有一种方法可以使用Shell.Execute,以便流程可以设置全局范围环境变量?

UPD

作为解决办法,我在AppVeyor.yml配置文件中添加了额外的步骤:

代码语言:javascript
复制
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作为目标,并获得版本号。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-10-05 08:09:42

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

代码语言:javascript
复制
#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
票数 1
EN

Stack Overflow用户

发布于 2016-05-01 10:03:56

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

您必须设置一个永久的环境变量,如用户级或计算机级。

看看Environment.SetEnvironmentVariable方法在.NET中的应用。

示例:

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36954741

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档