作为MikeS回答的继续,我想补充一点,需要安装VS + Visual Studio可视化和建模SDK才能使其正常运行,并且还需要修改项目文件。还应该提到的是,我使用Jenkins作为在带有版本模块的Windows 2008 R2服务器上运行的构建服务器,在其中获得了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>
这样,我就可以跟踪构建和变更集,因此,如果自上次构建以来未检查任何内容,则最后一位不应更改,但是我可能对构建过程进行了更改,因此需要倒数第二个。当然,如果您在构建之前进行了多次签入,那么您只会得到版本中反映的最新更改。我想您可以将其串联起来。
我确定您可以做些更有趣的事情,并直接从tt模板中调用TFS,但这对我有用。
然后,我可以像这样在运行时获取我的版本
Assembly assembly = Assembly.GetExecutingAssembly();
FileVersionInfo fvi = FileVersionInfo.GetVersionInfo(assembly.Location);
return fvi.FileVersion;