2016-04-30 141 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腳本。 –