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>
이렇게하면 빌드 및 변경 집합을 추적 할 수 있으므로 마지막 빌드 이후에 아무것도 확인하지 않은 경우 마지막 숫자는 변경되지 않아야하지만 빌드 프로세스를 변경했을 수 있으므로 두 번째 마지막 숫자가 필요합니다. . 물론 빌드 전에 여러 번 체크인하면 마지막 변경 사항 만 버전에 반영됩니다. 나는 당신이 그것을 연결할 수 있다고 생각합니다.
나는 당신이 더 멋진 것을 할 수 있고 tt 템플릿 내에서 직접 TFS를 호출 할 수 있다고 확신하지만 이것은 나를 위해 작동합니다.
그런 다음 런타임에 내 버전을 다음과 같이 가져올 수 있습니다.
Assembly assembly = Assembly.GetExecutingAssembly();
FileVersionInfo fvi = FileVersionInfo.GetVersionInfo(assembly.Location);
return fvi.FileVersion;