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

あなたの問題は、プロセスレベルの環境変数を作成することです。シェルプロセスが存在した後、別のプロセスで実行される次のステップは、そこで設定した環境変数を認識しません。

ユーザーレベルまたはマシンレベルのような永続的な環境変数を設定する必要があります。

.NETのEnvironment.SetEnvironmentVariableメソッドを見てください。

例:

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

ただし、これは良い解決策ではないと思います。私は GitVersion を知りませんし、率直に言って、なぜこれが必要なのか理解できません。ビルド スクリプトはセマンティック バージョン自体を判別できませんか? コードの変更に基づいてバージョンを正しくインクリメントする方法を自動化ツールが認識しないため、sem バージョンの設定は明らかに手動のステップです。したがって、プロジェクト内の 1 つの場所 (readme ノートなどの 1 つのファイル、または意味のあるその他の場所) を選択して、セマンティック バージョンを設定し、他のすべてのツールでそこからそれを読み取って、ビルド中にアセンブリ バージョンを設定し、ナゲット パッケージをパッケージ化する必要があります。 、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 に答える