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;