42

ソース管理として SVN を使用したサンプル プロジェクトで CCNET を使用しています。CCNET は、チェックインごとにビルドを作成するように構成されています。CCNET は、MSBuild を使用してソース コードをビルドします。

AssemblyInfo.csコンパイル時に最新のリビジョン番号を使用して生成したいと考えています。Subversion から最新のリビジョンを取得し、その値を CCNET で使用するにはどうすればよいですか?

編集: NAnt は使用していません。MSBuild のみを使用しています。

4

12 に答える 12

45

CruiseControl.Net 1.4.4 には、.Net アセンブリ プロパティと互換性のあるバージョン番号を生成するAssembly Version Labellerが追加されました。

私のプロジェクトでは、次のように構成しています。

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

(注意:assemblyVersionLabeller実際のコミットによってトリガーされたビルドが発生するまで、svn リビジョン ベースのラベルの生成は開始されません。)

次に、 MSBuildCommunityTasks.AssemblyInfoを使用して MSBuild プロジェクトからこれを使用します。

<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>

完全を期すために、MSBuild の代わりに NAnt を使用するプロジェクトでも同様に簡単です。

<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>
于 2009-06-10T12:37:30.197 に答える
14

基本的に 2 つのオプションがあります。出力を開始して解析する簡単なスクリプトを作成するか、

svn.exe 情報 --リビジョン HEAD

リビジョン番号を取得する (AssemblyInfo.cs の生成は非常に簡単です) か、単に CCNET のプラグインを使用します。ここにあります:

SVN Revision Labellerは、Subversion 作業コピーのリビジョン番号に基づいて、ビルドの CruiseControl ラベルを生成できる CruiseControl.NET のプラグインです。これは、プレフィックスおよび/またはメジャー/マイナー バージョン番号でカスタマイズできます。

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();
        }
    }
}
于 2008-08-04T11:56:42.533 に答える
4

SVN情報の解析とプロパティの作成を処理するNAntビルドファイルを作成しました。次に、これらのプロパティ値を、ビルドでのラベルの設定など、さまざまなビルドタスクに使用します。このターゲットを、luboshaskoが言及したSVNリビジョンラベラーと組み合わせて使用​​すると、すばらしい結果が得られます。

<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>
于 2008-08-04T13:43:54.530 に答える
4

Googleコードでこのプロジェクトを見つけました。CCNETでラベルを生成するプラグインですCCNET

DLLでテストされていますCCNET 1.3が、私にとってはうまくCCNET 1.4いきます。このプラグインを使用してビルドにラベルを付けることに成功しています。

今それを渡すことにMSBuild...

于 2008-08-04T11:51:59.297 に答える
4

MSBuild構成よりもサイドでやりたい場合はCCNetMSBuildコミュニティ タスク拡張機能のSvnVersionタスクがうまくいくようです。

于 2008-08-04T12:03:03.487 に答える
3

AssemblyInfo.csを自動生成するためのcsprojファイルのカスタマイズ
http://www.codeproject.com/KB/dotnet/Customizing_csproj_files.aspx

新しいC#プロジェクトを作成するたびに、VisualStudioはAssemblyInfo.csファイルを配置します。このファイルは、バージョン、構成、プロデューサーなどのアセンブリメタデータを定義します。

MSBuildを使用してAssemblyInfo.csを自動生成する上記の手法を見つけました。間もなくサンプルを投稿します。

于 2008-08-04T13:22:31.640 に答える
3

私は現在、cmdnetsvnrevツールを使用して prebuild-exec タスクを介して「手動で」実行していますが、ccnet に統合されたより良い方法を誰かが知っている場合は、喜んで聞いてください :-)

于 2008-08-04T11:41:37.133 に答える
3

これが CCNET で機能するかどうかはわかりませんが、 CodePlex のBuild Version Incrementプロジェクト用にSVN バージョンのプラグインを作成しました。このツールは非常に柔軟で、svn リビジョンを使用してバージョン番号を自動的に作成するように設定できます。コードを書いたり、xml を編集したりする必要はありません。

これが役立つことを願っています!

于 2010-04-12T01:04:20.763 に答える
2

どこでこれを見つけたのかわかりません。しかし、私はこれをインターネット上の「どこか」で見つけました。

これにより、ビルドが行われる前にすべての AssemblyInfo.cs ファイルが更新されます。

魅力のように機能します。すべての exe と dll は 1.2.3.333 として表示されます (「333」が当時の SVN リビジョンの場合) (AssemblyInfo.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/エクスプローラー//ファイル/プロパティで……。

アセンブリ バージョンは 1.0.0.0 になります。

333 が SVN リビジョンの場合、ファイル バージョンは 1.0.0.333 になります。

于 2012-09-18T17:18:26.017 に答える
2

Skolimas ソリューションに基づいて、NAnt スクリプトを更新し、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>
于 2009-09-12T10:03:28.150 に答える
2

私のアプローチは、前述の ccnet 用プラグインと nant echo タスクを使用してVersionInfo.cs、バージョン属性のみを含むファイルを生成することです。VersionInfo.csファイルをビルドに含めるだけです

echo タスクは、指定した文字列をファイルに出力するだけです。

同様の MSBuild タスクがある場合は、同じアプローチを使用できます。私が使用する小さな nant タスクは次のとおりです。

<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 にあまり詳しくないので、私のスクリプトはそのままでは機能せず、修正が必要になる可能性があることに注意してください...

于 2009-02-03T04:16:04.260 に答える
1

気をつけて。ビルド番号に使用される構造は短いため、リビジョンの高さには上限があります。

私たちの場合、すでに制限を超えています。

ビルド番号99.99.99.599999を入力しようとすると、ファイルバージョンプロパティは実際には99.99.99.10175として出力されます。

于 2009-02-03T18:34:49.067 に答える