문제

내가 사용하 CCNET 에 샘플 프로젝트 SVN 으로 원본을 제어합니다.CCNET 구성되어 만들기 모든 확인합니다.CCNET 사용 MSBuild 을 구축하는 소스 코드입니다.

를 사용하고 싶은 최신 버전 번호를 생성 AssemblyInfo.cs 컴파일하는 동안.어떻게 검색할 수 있는 최신 버전에서 파괴와 값을 사용에 CCNET?

편집:나는 사용하지 않는 넝-만 스위치를 참조하십시오

도움이 되었습니까?

해결책

CruiseControl.Net 1.4.4 는 지금 어셈블리의 버전을 한 레이블업체, 를 생성하는 버전 번호 와 호환이 가능합니다.Net 어셈블리의 속성입니다.

프로젝트에 내가 그것으로 구성된:

<labeller type="assemblyVersionLabeller" incrementOnFailure="true" major="1" minor="2"/>

(주의: assemblyVersionLabeller 시작하지 않을 것을 생성하 svn revision 기반 레이블을 때까지 실제 commit-트리거를 구축이 발생합니다.)

다이에서 내 MSBuild 프로젝트 MSBuildCommunityTasks.첫 번째 절차를 수행하여 소스 :

<Import Project="$(MSBuildExtensionsPath)\MSBuildCommunityTasks\MSBuild.Community.Tasks.Targets"/>
<Target Name="BeforeBuild">
  <AssemblyInfo Condition="'$(CCNetLabel)' != ''" CodeLanguage="CS" OutputFile="Properties\AssemblyInfo.cs" 
  AssemblyTitle="MyTitle" AssemblyCompany="MyCompany" AssemblyProduct="MyProduct"
  AssemblyCopyright="Copyright ©  2009" ComVisible="false" Guid="some-random-guid"
  AssemblyVersion="$(CCNetLabel)" AssemblyFileVersion="$(CCNetLabel)"/>
</Target>

을 위해 completness,그것은 쉬운 프로젝트를 사용하여 넝 대신 MSBuild:

<target name="setversion" description="Sets the version number to CruiseControl.Net label.">
    <script language="C#">
        <references>
            <include name="System.dll" />
        </references>
        <imports>
            <import namespace="System.Text.RegularExpressions" />
        </imports>
        <code><![CDATA[
             [TaskName("setversion-task")]
             public class SetVersionTask : Task
             {
              protected override void ExecuteTask()
              {
               StreamReader reader = new StreamReader(Project.Properties["filename"]);
               string contents = reader.ReadToEnd();
               reader.Close();
               string replacement = "[assembly: AssemblyVersion(\"" + Project.Properties["CCNetLabel"] + "\")]";
               string newText = Regex.Replace(contents, @"\[assembly: AssemblyVersion\("".*""\)\]", replacement);
               StreamWriter writer = new StreamWriter(Project.Properties["filename"], false);
               writer.Write(newText);
               writer.Close();
              }
             }
             ]]>
        </code>
    </script>
    <foreach item="File" property="filename">
        <in>
            <items basedir="..">
                <include name="**\AssemblyInfo.cs"></include>
            </items>
        </in>
        <do>
            <setversion-task />
        </do>
    </foreach>
</target>

다른 팁

당신은 기본적으로 두 가지 옵션이 있습니다.하나 당신이 쓰는 간단한 스크립트를 시작하고 분석에서 출력

svn.exe 정보--revision 리

을 얻을 수정 번호(그때를 생성하 어셈블리 정보.cs 꽤 많은 똑바로 앞으로)거나 사용하여 플러그인에 대한 CCNET.그것은 여기:

SVN 한 레이블업체 개정 플러그인에 대한 CruiseControl.순할 수 있는 생 CruiseControl 라벨 빌드를 기반으로 개정 번호 의 파괴합니다.이 할 수 있는 맞춤형 접두사로 그리고/또는 큰/작은 버전 숫자입니다.

http://code.google.com/p/svnrevisionlabeller/

내가 선호하는 첫 번째 옵션이기 때문에 그것은 단지 대략 20 라인의 코드:

using System;
using System.Diagnostics;

namespace SvnRevisionNumberParserSample
{
    class Program
    {
        static void Main()
        {
            Process p = Process.Start(new ProcessStartInfo()
                {
                    FileName = @"C:\Program Files\SlikSvn\bin\svn.exe", // path to your svn.exe
                    UseShellExecute = false,
                    RedirectStandardOutput = true,
                    Arguments = "info --revision HEAD",
                    WorkingDirectory = @"C:\MyProject" // path to your svn working copy
                });

            // command "svn.exe info --revision HEAD" will produce a few lines of output
            p.WaitForExit();

            // our line starts with "Revision: "
            while (!p.StandardOutput.EndOfStream)
            {
                string line = p.StandardOutput.ReadLine();
                if (line.StartsWith("Revision: "))
                {
                    string revision = line.Substring("Revision: ".Length);
                    Console.WriteLine(revision); // show revision number on screen                       
                    break;
                }
            }

            Console.Read();
        }
    }
}

내가 쓴 넝 구축 파일을 처리하는 분석 SVN 정보 및 만들기 속성입니다.나는 그 사람에 대한 속성 값은 다양한 작업을 포함하여 설정하는 레이블에 버튼을 눌러 설치할 수 있습니다.내가 사용하는 이 대상과 함께 SVN 개정 한 레이블업체에 의해 언급 lubos hasko 으로 좋은 결과입니다.

<target name="svninfo" description="get the svn checkout information">
    <property name="svn.infotempfile" value="${build.directory}\svninfo.txt" />
    <exec program="${svn.executable}" output="${svn.infotempfile}">
        <arg value="info" />
    </exec>
    <loadfile file="${svn.infotempfile}" property="svn.info" />
    <delete file="${svn.infotempfile}" />

    <property name="match" value="" />

    <regex pattern="URL: (?'match'.*)" input="${svn.info}" />
    <property name="svn.info.url" value="${match}"/>

    <regex pattern="Repository Root: (?'match'.*)" input="${svn.info}" />
    <property name="svn.info.repositoryroot" value="${match}"/>

    <regex pattern="Revision: (?'match'\d+)" input="${svn.info}" />
    <property name="svn.info.revision" value="${match}"/>

    <regex pattern="Last Changed Author: (?'match'\w+)" input="${svn.info}" />
    <property name="svn.info.lastchangedauthor" value="${match}"/>

    <echo message="URL: ${svn.info.url}" />
    <echo message="Repository Root: ${svn.info.repositoryroot}" />
    <echo message="Revision: ${svn.info.revision}" />
    <echo message="Last Changed Author: ${svn.info.lastchangedauthor}" />
</target>

내가 발견 프로젝트에서 google 코드입니다.이 CCNET 플러그인을 생성에서 라벨 CCNET.

DLL 테스트 CCNET 1.3 그러나 그것은 작동 CCNET 1.4 습니다.나는 성공적으로 이 플러그인을 사용하여 레이블을 내다.

지금에 전달하기 MSBuild...

당신이 선호하는 경우 그것을 하기에 MSBuild 측상 CCNet config,처럼 보인 MSBuild 커뮤니티 작업의 확장 SvnVersion 작업할 수 있습니다.

나는 현재""수동으로 하고 그것을 통해 사전 빌드-exec 작업을 사용하여 내 cmdnetsvnrev 도구지만,만약 누군가가 알고있는 더 나은 ccnet-통합된 방법으로 그 일의,나는 행복할 것이 듣기:-)

사용자 지정 csproj 파일을 자동으로 생성하는 동안 첫 번째 절차를 수행하여 소스.cs
http://www.codeproject.com/KB/dotnet/Customizing_csproj_files.aspx

매번 우리를 새로 만들 C#프로젝트 Visual Studio 에이 첫 번째 절차를 수행하여 소스.cs 파일입니다.파일 정의 어셈블리 메타 데이터 처럼 해당 버전,설정,또는 프로듀서이다.

을 발견 상기 기술을 자동 차세대 어셈블리 정보.cs 를 사용하여 스위치를 참조하십시오을 게시하는 샘플습니다.

나는 확실하지 않으면 이 작업 CCNET 나지 않지만,제가 생성 SVN 버전은 plug-in빌드 버전이 증가 프로젝트에 CodePlex.이 도구는 매우 유연한 설정할 수 있습을 자동으로 만들어 버전 번호를 사용하여 당신을 위해 svn 수 있습니다.그것은 필요하지 않든 코드를 작성하거나 편집하는 xml,so 다!

이 도움이 됩니다!

내 방법을 사용하여 상기 플러그인에 대한 ccnet 및 넝 echo 작업을 생성 VersionInfo.cs 를 포함한 파일을 아무것도 하지만 버전 특성이 있습니다.나만 포함 VersionInfo.cs 으로 파일 구축

Echo 작업은 단순히 출력 문자열을 나는 그것을 제공하는 파일입니다.

이 있는 경우 비슷한 MSBuild 작업을 사용할 수 있습니다 똑같은 방식으로 대응합니다.여기에 작은 넝 작업을 사용:

<target name="version" description="outputs version number to VersionInfo.cs">
  <echo file="${projectdir}/Properties/VersionInfo.cs">
    [assembly: System.Reflection.AssemblyVersion("$(CCNetLabel)")]
    [assembly: System.Reflection.AssemblyFileVersion("$(CCNetLabel)")]
  </echo>
</target>

이것을 보십시오:

<ItemGroup>
    <VersionInfoFile Include="VersionInfo.cs"/>
    <VersionAttributes>
        [assembly: System.Reflection.AssemblyVersion("${CCNetLabel}")]
        [assembly: System.Reflection.AssemblyFileVersion("${CCNetLabel}")]
    </VersionAttributes>
</ItemGroup>
<Target Name="WriteToFile">
    <WriteLinesToFile
        File="@(VersionInfoFile)"
        Lines="@(VersionAttributes)"
        Overwrite="true"/>
</Target>

참고로 나는 매우 친밀 MSBuild,그래서 스크립트는 아마이 작동하지 않을 out-of-the-box 고 필요한 수정을...

에 따라 skolimas 방법을 지속적으로 연구하고 업데이트 넝 스크립트를 업데이트 AssemblyFileVersion.감사 skolima 코드!

<target name="setversion" description="Sets the version number to current label.">
        <script language="C#">
            <references>
                    <include name="System.dll" />
            </references>
            <imports>
                    <import namespace="System.Text.RegularExpressions" />
            </imports>
            <code><![CDATA[
                     [TaskName("setversion-task")]
                     public class SetVersionTask : Task
                     {
                      protected override void ExecuteTask()
                      {
                       StreamReader reader = new StreamReader(Project.Properties["filename"]);
                       string contents = reader.ReadToEnd();
                       reader.Close();                     
                       // replace assembly version
                       string replacement = "[assembly: AssemblyVersion(\"" + Project.Properties["label"] + "\")]";
                       contents = Regex.Replace(contents, @"\[assembly: AssemblyVersion\("".*""\)\]", replacement);                                        
                       // replace assembly file version
                       replacement = "[assembly: AssemblyFileVersion(\"" + Project.Properties["label"] + "\")]";
                       contents = Regex.Replace(contents, @"\[assembly: AssemblyFileVersion\("".*""\)\]", replacement);                                        
                       StreamWriter writer = new StreamWriter(Project.Properties["filename"], false);
                       writer.Write(contents);
                       writer.Close();
                      }
                     }
                     ]]>
            </code>
        </script>
        <foreach item="File" property="filename">
            <in>
                    <items basedir="${srcDir}">
                            <include name="**\AssemblyInfo.cs"></include>
                    </items>
            </in>
            <do>
                    <setversion-task />
            </do>
        </foreach>
    </target>

아이디어가 어디에 있습니다.그러나 나는 이것이 인터넷에서"somewhere".

이 모든 업데이트 어셈블리 정보.cs 파일 빌드 전에 일어난다.

마치 마법처럼 작동합니다.내 모든 exe 과 dll 의 표시로 1.2.3.333(는 경우"333"었 SVN revision 습니다.) (고 원전에서 첫 번째 절차를 수행하여 소스.cs 파일에 상장되었으로"1.2.3.0")


$(ProjectDir)(나.sln 파일이 있는)

$(SVNToolPath)(점 svn.exe)

내 사용자 지정 변수,그들의 선언/정의하지 않은의 정의는 다음과 같습니다.


http://msbuildtasks.tigris.org/ 그리고/또는 https://github.com/loresoft/msbuildtasks 가(FileUpdate 및 SvnVersion)작업입니다.


  <Target Name="SubVersionBeforeBuildVersionTagItUp">

    <ItemGroup>
      <AssemblyInfoFiles Include="$(ProjectDir)\**\*AssemblyInfo.cs" />
    </ItemGroup>

    <SvnVersion LocalPath="$(MSBuildProjectDirectory)" ToolPath="$(SVNToolPath)">
      <Output TaskParameter="Revision" PropertyName="MySubVersionRevision" />
    </SvnVersion>

    <FileUpdate Files="@(AssemblyInfoFiles)"
            Regex="(\d+)\.(\d+)\.(\d+)\.(\d+)"
            ReplacementText="$1.$2.$3.$(MySubVersionRevision)" />
  </Target>

편집--------------------------------------------------

위은 실패할 수 있습니다 후 SVN 개정 번호 도달 65534 또는 더 높습니다.

보:

을 끄고 경고 CS1607

여기에는 해결 방법입니다.

<FileUpdate Files="@(AssemblyInfoFiles)"
Regex="AssemblyFileVersion\(&quot;(\d+)\.(\d+)\.(\d+)\.(\d+)"
ReplacementText="AssemblyFileVersion(&quot;$1.$2.$3.$(SubVersionRevision)" />

의 결과에 이어야 한다:

Windows/익스플로러//File/성.......

어셈블리 버전이 될 것입니다리 1.0.0.0.

파일 버전이 될 것입니다 1.0.0.333 경우 333SVN 수 있습니다.

주의 해야 합니다.구조물에 사용된 숫자는 단지 짧은 그래서 당신은 천장에서 얼마나 높은 개정할 수 있습니다.

우리의 경우에,우리는 이미 초과한 제한.

는 경우에 당신을 넣으려는 시도에서 빌드 번호 99.99.99.599999,파일 버전 속성이 실제로 나와 99.99.99.10175.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top