msbuild 구축 시 Assembly Version 의 Revision 버 전 번호 대신 SVN 으로 버 전 번 호 를 수정 합 니 다.

지속 적 인 구축 은 매번 구 축 된 버 전 을 표시 해 야 하고 구축 할 때마다 인공 적 으로 버 전 을 수정 하 는 것 은 비 현실 적 이다.프로그램 으로 버 전 번 호 를 추가 합 니 다. 선택 할 수 있 는 세 가지 가 있 습 니 다. 1) 순서 흐름 번호;2) 타임 스탬프;3) SVN 검출 코드 의 수정 버 전 번호
1) 순서 흐름 번호.매번 구축 할 때마다 지난번 에 기 록 된 흐름 번 호 를 + 1 로 버 전 으로 업데이트 해 야 합 니 다.매번 구 축 된 버 전 번 호 를 기록 하려 면 코드 기 에 제출 해 야 한다. 코드 수정 버 전 + 1 을 초래 할 뿐만 아니 라 구축 할 때 동쪽 에 제출 하 는 것 은 항상 불쾌 한 일이 다.
2) 타임 스탬프.유수 호 에 비해 믿 을 만 한 것 이 많 고 너무 길 어서 초 단위 로 도 하루 에 86400 의 증 가 량 이다.
3) SVN 에서 코드 가 검출 되 었 을 때의 수정 버 전 번호.가장 믿 을 만 한 것 은 바로 이것 입 니 다. 코드 가 업데이트 되 고 버 전 번호 가 증가 하 며 코드 가 업데이트 되 지 않 았 으 며 버 전 번호 가 변 하지 않 습 니 다.일반적인 상황 에서 코드 가 변 하지 않 고 구축 결과 에 차이 가 있 을 필요 가 없 기 때문에 이것 을 선택 하 세 요!
물론 이 블 로그 의 관건 은 여기에 있 지 않 습 니 다. MSBuild 가 구축 할 때 버 전 번 호 를 얻 고 Assembly Info. cs 의 Assembly Version 이나 Assembly FileVersion 을 교체 하 는 것 이 관건 입 니 다.이것 은 원생 의 MSBuild Task 로 는 할 수 없 을 것 같 고, 스스로 Task 를 쓰 는 것 은 너무 피곤 하 다.그래서 제3자 Task: MSBuild Community Tasks 를 찾 았 습 니 다.
사실 이것 은 MSBuild Community Tasks 를 처음 접 하 는 것 이 아 닙 니 다. 지난번 에 사용 한 것 은 프로젝트 구축 시 생 성 된 결 과 를 압축 파일 로 포장 해 야 하기 때문에 Zip Task 를 사 용 했 습 니 다.이번 에는 두 개의 Task 를 사용 해 야 합 니 다.
SvnVersion Task, 코드 를 가 져 오 는 SVN 수정 버 전 번호
FileUpdate, AssemblyInfo. cs 파일 업데이트
다음은 실험 환경 과 코드 입 니 다.
우선 프로젝트 디 렉 터 리 구조 (test. xml 은 MSBuild 구축 스 크 립 트)
C:.
├─build
│  │  test.xml
│  │
│  └─msbuildtasks
│          MSBuild.Community.Tasks.dll
│          MSBuild.Community.Tasks.Targets
│
└─MyProject
    └─Properties
            AssemblyInfo.cs

빌 드 스 크 립 트 는 하나의 이벤트 만 했 습 니 다. 바로 Assembly Info. cs 의 두 버 전 번 호 를 업데이트 하 는 마지막 (버 전 번호 수정) 입 니 다.
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="Test" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <Import Project="msbuildtasks\MSBuild.Community.Tasks.Targets" />
    <PropertyGroup>
        <MSBuildCommunityTasksLib>$([MSBUILD]::Unescape(MSBuild.Community.Tasks.dll))</MSBuildCommunityTasksLib>
    </PropertyGroup>

    <Target Name="Test">
        <ItemGroup>
            <AssemblyInfos Include="..\MyProject\**\AssemblyInfo.cs" />
        </ItemGroup>

        <SvnVersion LocalPath=".">
            <Output TaskParameter="Revision" PropertyName="Revision" />
        </SvnVersion>

        <Message Text="Revision: $(Revision)" />

        <FileUpdate Files="@(AssemblyInfos)"
            Regex="\(&quot;(\d+\.\d+\.\d+\.)\d+&quot;\)\]"
            ReplacementText="(&quot;${1}$(Revision)&quot;)]" />
    </Target>
</Project>

스 크 립 트 설명:
    <Import Project="msbuildtasks\MSBuild.Community.Tasks.Targets" />
    <PropertyGroup>
        <MSBuildCommunityTasksLib>$([MSBUILD]::Unescape(MSBuild.Community.Tasks.dll))</MSBuildCommunityTasksLib>
    </PropertyGroup>

여 기 는 MSBuild Community Tasks 를 도입 한 동적 라 이브 러 리 입 니 다. 공식 적 으로 작성 하면 그대로 베 끼 면 됩 니 다.
        <ItemGroup>
            <AssemblyInfos Include="..\MyProject\**\AssemblyInfo.cs" />
        </ItemGroup>

하나의 솔 루 션 에 있 는 여러 항목 의 버 전 번 호 를 함께 업데이트 할 수 있 도록 모든 Assembly Info. cs 를 찾 습 니 다.
        <SvnVersion LocalPath=".">
            <Output TaskParameter="Revision" PropertyName="Revision" />
        </SvnVersion>

현재 코드 의 SVN 수정 버 전 번 호 를 가 져 오 는 것 이 분명 합 니 다. LocalPath 는 어떤 디 렉 터 리 의 버 전 번 호 를 가 져 올 지 지정 하고, Output 은 가 져 온 수정 버 전 번 호 를 "Revision" 속성 에 출력 합 니 다. Output 에 대해 서 는 참고 할 수 있 습 니 다. http://msdn.microsoft.com/zh-cn/library/ms164287.aspx
주의해 야 할 것 은 PATH 경로 에서 svnversion 명령 을 찾 을 수 있 습 니 다.PATH 가 설정 되 어 있 지 않 으 면 ToolPath 매개 변 수 를 사용 하여 svnversion 이 있 는 디 렉 터 리 를 지정 할 수 있 습 니 다.
        <FileUpdate Files="@(AssemblyInfos)"
            Regex="\(&quot;(\d+\.\d+\.\d+\.)\d+&quot;\)\]"
            ReplacementText="(&quot;${1}$(Revision)&quot;)]" />

이 부분 은 정규 표현 식 을 통 해 교체 버 전 번 호 를 찾 는 것 입 니 다.때로는 두 가지 주의 가 필요 하 다. 하 나 는 따옴표 를 쓸 때 & quot 를 사용 해 야 한다.대신둘 째 는 문자열 을 바 꾸 는 데 ${1} 을 $1 로 대체 하 는 것 이 좋 습 니 다. 뒤의 $(Revision) 도 숫자 이기 때문에 괄호 로 연결 하지 않 으 면 $1123 이 될 수 있 습 니 다. 정확하게 식별 되 지 않 습 니 다. 괄호 로 ${1} 123 이 므 로 오류 가 발생 하지 않 습 니 다.

좋은 웹페이지 즐겨찾기