元ネタのほとんどは http://richardsbraindump.blogspot.com/2007/07/versioning-builds-with-tfs-and-msbuild.html
msbuildcommunitytasks を投入
冒頭、<Import Project="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\TeamBuild\Microsoft.TeamFoundaiton.Build.targets" />
の次の行に<Import Project="$(MSBuildExtensionsPath)\MSBuildCommunityTasks\MSBuild.Community.Tasks.Targets"/>
メインの部分は以下のようにした。内容的な概要はこんな。
- AssemblyInfoFiles という ItemGroup は、ソリューションに含まれる AssemblyInfo.cs を入れる。** を使うと便利。
- GetTFSVersion は、TfsVersion を使ってバージョンを取得するはずだった。が、利用しているmsbuildcommunitytasks が古く、アセンブリの読み込みに失敗。今回はあきらめて日時ベースの番号をつけることに。
- BeforeCompileConfiguration ターゲットで実際に番号の置き換え。このターゲットはカスタマイズ可能な Team Foundatoin のビルドターゲットである。
- 以前は AssemblyInfo コマンドを使って生成していたが、バージョン番号ぐらいだったら正規表現での文字列置き換えの方が楽だ。AssemblyInfo.cs に登場する要素はほぼ固定なのでこれでよい。
<ItemGroup>
<AssemblyInfoFiles Include="$(SolutionRoot)\**\AssemblyInfo.cs" />
</ItemGroup>
<Target Name="GetTFSVersion">
<Message Importance="high" Text="Updating Version: $(Major).$(Minor).$(Build).$(Revision)" />
<Time Format="MMdd">
<Output TaskParameter="FormattedTime" PropertyName="Build" />
</Time>
<Time Format="hhmm">
<Output TaskParameter="FormattedTime" PropertyName="Revision" />
</Time>
<Message Importance="high" Text="New Version: $(Major).$(Minor).$(Build).$(Revision)" />
</Target>
<Target Name="BeforeCompileConfiguration" DependsOnTargets="GetTFSVersion">
<Attrib Files="@(AssemblyInfoFiles)" Normal="true" />
<FileUpdate Files="@(AssemblyInfoFiles)"
Regex="AssemblyVersion\(".*"\)\]"
ReplacementText="AssemblyVersion("$(Major).$(Minor).$(Build).$(Revision)")]" />
<FileUpdate Files="@(AssemblyInfoFiles)"
Regex="AssemblyFileVersion\(".*"\)\]"
ReplacementText="AssemblyFileVersion("$(Major).$(Minor).$(Build).$(Revision)")]" />
</Target>