MikeS の回答の続きとして、これを機能させるには VS + Visual Studio Visualization and Modeling SDK をインストールする必要があり、プロジェクト ファイルも変更する必要があることを追加したいと思いました。また、バージョンモジュールを備えたWindows 2008 R2サーバーボックスで実行されるビルドサーバーとしてJenkinsを使用し、BUILD_NUMBERを取得することにも言及する必要があります。
私のテキストテンプレートファイル version.tt は次のようになります
<#@ template debug="false" hostspecific="false" language="C#" #>
<#@ output extension=".cs" #>
<#
var build = Environment.GetEnvironmentVariable("BUILD_NUMBER");
build = build == null ? "0" : int.Parse(build).ToString();
var revision = Environment.GetEnvironmentVariable("_BuildVersion");
revision = revision == null ? "5.0.0.0" : revision;
#>
using System.Reflection;
[assembly: AssemblyVersion("<#=revision#>")]
[assembly: AssemblyFileVersion("<#=revision#>")]
プロパティグループには次のものがあります
<PropertyGroup>
<TransformOnBuild>true</TransformOnBuild>
<OverwriteReadOnlyOutputFiles>true</OverwriteReadOnlyOutputFiles>
<TransformOutOfDateOnly>false</TransformOutOfDateOnly>
</PropertyGroup>
Microsoft.CSharp.targets をインポートした後、これがあります (VS をインストールする場所によって異なります)
<Import Project="C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\TextTemplating\v10.0\Microsoft.TextTemplating.targets" />
私のビルド サーバーでは、実際のビルドの前にテキスト変換を実行し、TFS で最後の変更セット番号を取得する次のスクリプトがあります。
set _Path="C:\Build_Source\foo"
pushd %_Path%
"%ProgramFiles(x86)%\Microsoft Visual Studio 10.0\Common7\IDE\tf.exe" history . /r /noprompt /stopafter:1 /Version:W > bar
FOR /f "tokens=1" %%foo in ('findstr /R "^[0-9][0-9]*" bar') do set _BuildVersion=5.0.%BUILD_NUMBER%.%%foo
del bar
popd
echo %BUILD_NUMBER%
echo %_BuildVersion%
cd C:\Program Files (x86)\Jenkins\jobs\MyJob\workspace\MyProject
MSBuild MyProject.csproj /t:TransformAll
...
<rest of bld script>
このようにして、ビルドと変更セットを追跡できるため、最後のビルド以降に何もチェックインしていない場合、最後の桁は変更されませんが、ビルドプロセスに変更を加えた可能性があるため、最後から2番目の数字が必要です. もちろん、ビルドの前に複数のチェックインを行うと、最後の変更のみがバージョンに反映されます。それを連結できると思いますが必要です。
もっと手の込んだことをして、tt テンプレート内から直接 TFS を呼び出すことができると確信していますが、これは私にとってはうまくいきます。
次に、このように実行時にバージョンを取得できます
Assembly assembly = Assembly.GetExecutingAssembly();
FileVersionInfo fvi = FileVersionInfo.GetVersionInfo(assembly.Location);
return fvi.FileVersion;