26

SVN リポジトリのリビジョン番号を .NET アセンブリのバージョン文字列に含める方法はありますか? Major.Minor.SVNRev のようなもの

CC.NET のようなものでこれを行うという言及を見たことがありますが (実際には ASP.NET で)、追加のソフトウェアなしでそれを行う方法はありますか? ビルド バッチ スクリプトを使用する前に、C/C++ で同様のことを行ったことがありますが、バージョン番号を読み取ってから、スクリプトに毎回 "ver.h" というファイルを書き出すことで次のような効果が得られました。

#define MAJORVER 4
#define MINORVER 23
#define SOURCEVER 965

次に、これらの定義を使用してバージョン文字列を生成します。

このようなことは .NET で可能ですか?

4

8 に答える 8

32

アセンブリのリビジョン情報を自動的に更新する C# の例を次に示します。これは、あまり精巧ではない Will Dean の回答に基づいています。

例 :

  1. プロジェクトのフォルダーPropertiesにある AssemblyInfoTemplate.cs に AssemblyInfo.cs をコピーします。
  2. AssemblyInfoTemplate.csのBuild ActionNoneに変更します。
  3. AssemblyFileVersion の行を次のように変更します。

    [assembly: AssemblyFileVersion("1.0.0.$WCREV$")]

  4. 以下を追加することを検討してください。

    [assembly: AssemblyInformationalVersion("Build date: $WCNOW=%Y-%m-%d %H:%M:%S$; Revision date: $WCDATE=%Y-%m-%d %H:%M:%S$; Revision(s) in working copy: $WCRANGE$$WCMODS?; WARNING working copy had uncommitted modifications:$.")]

    これにより、アセンブリがビルドされたソースのリビジョン ステータスに関する詳細が得られます。

  5. 次のビルド前イベントをプロジェクト ファイルのプロパティに追加します。

    subwcrev "$(SolutionDir)." "$(ProjectDir)Properties\AssemblyInfoTemplate.cs" "$(ProjectDir)Properties\AssemblyInfo.cs" -f

  6. AssemblyInfo.cs を svn 無視リストに追加することを検討してください。リビジョン番号と日付を置き換えると、ファイルが変更され、重要でない変更とリビジョンが発生し、$WCMODS$ は true と評価されます。もちろん、AssemblyInfo.cs をプロジェクトに含める必要があります。

Wim Coenen の反論に応えて、Darryl の提案とは対照的に、AssemblyFileVersion も2^16 を超える数値をサポートしていないことに気付きました。ビルドは完了しますが、実際のアセンブリのプロパティファイル バージョンは AssemblyFileVersion modulo 65536 になります。したがって、1.0.0.65536 と 1.0.0.131072 は 1.0.0.0 などになります。この例では、常に正しいリビジョン番号があります。 AssemblyInformationalVersion プロパティで。これが重大な問題であると考える場合は、ステップ 3 を省略できます。

編集:このソリューションをしばらく使用した後の追加情報。

  1. AssemblyInfoTemplate.cs ではなく AssemblyInfo.cst を使用するようになりました。これは、ビルド アクションオプションNoneが自動的に設定され、エラー リストが乱雑になることはありませんが、構文の強調表示が失われるためです。
  2. AssemblyInfo.cst ファイルに 2 つのテストを追加しました。

    #if(!DEBUG)    
        $WCMODS?#error Working copy has uncommitted modifications, please commit all modifications before creating a release build.:$ 
    #endif 
    #if(!DEBUG)       
        $WCMIXED?#error Working copy has multiple revisions, please update to the latest revision before creating a release build.:$ 
    #endif
    

    これを使用すると、通常、コミット後、リリース ビルドを成功させる前に、完全な SVN 更新を実行する必要があります。それ以外の場合、$WCMIXED は true になります。これは、コミットされたファイルがコミット後にヘッドリビジョンに再設定されているが、他のファイルはそうではないという事実が原因のようです。

  3. svn のバージョン情報をチェックするためのスコープを設定する subwcrev の最初のパラメータ「$(SolutionDir)」が常に期待どおりに機能するかどうか、疑問がありました。個々のアセンブリが一貫したリビジョンにあることに満足している場合は、おそらく $(ProjectDir) にする必要があります。

追加 @tommylux によるコメントに回答します。

SubWcRev は、プロジェクト内の任意のファイルに使用できます。Web ページにリビジョン情報を表示する場合は、次の VersionInfo テンプレートを使用できます。

public class VersionInfo
{       
    public const int RevisionNumber = $WCREV$;
    public const string BuildDate = "$WCNOW=%Y-%m-%d %H:%M:%S$";
    public const string RevisionDate = "$WCDATE=%Y-%m-%d %H:%M:%S$";
    public const string RevisionsInWorkingCopy = "$WCRANGE$";
    public const bool UncommitedModification = $WCMODS?true:false$;
}

AssemblyInfo.cst のようなビルド前のイベントを追加すると、関連するすべての SubVersion 情報に簡単にアクセスできます。

于 2013-01-07T12:01:10.763 に答える
6

SubWCRev を見てください - http://tortoisesvn.net/docs/release/TortoiseSVN_en/tsvn-subwcrev.html

アセンブリのバージョン番号は、通常、assemblyinfo.cs にあります。

于 2008-08-15T12:29:04.327 に答える
5

これらのドキュメントを読んでください:

DotSVN を使用して .NET から Subversion リポジトリにアクセスする

方法: タスクを作成する

C# AssemblyInfo ファイルに SVN バージョンとビルド番号を挿入します

Microsoft Build Engine のカスタム タスクを使用してアプリをコンパイルする

3 番目のリファレンスで言及されている MSBuildCommunityTasks svnversion は、Mac 10.5.6 上の svn と、Vista をホストする Parallels 内 (つまり、OS 全体) でビルドされた VS2008 C# プロジェクトでは実行されません。

DoSVN を使用してリポジトリからリビジョンを取得する独自のタスクを作成します。

using System;
using Microsoft.Build.Framework;
using Microsoft.Build.Utilities;
using DotSVN.Common;
using DotSVN.Common.Entities;
using DotSVN.Common.Util;
using DotSVN.Server.RepositoryAccess;

namespace GetSVNVersion
{
    public class GetRevision : Task
    {
        [Required]
        public string Repository { get; set; }
        [Output]
        public string Revision { get; set; }

        public override bool Execute()
        {
            ISVNRepository repo;
            bool connected = true;
            try
            {
                repo = SVNRepositoryFactory.Create(new SVNURL(Repository));
                repo.OpenRepository();
                Revision = repo.GetLatestRevision().ToString();
                Log.LogCommandLine(Repository + " is revision " + Revision);
                repo.CloseRepository();
            }
            catch(Exception e)
            {
                Log.LogError("Error retrieving revision number for " + Repository + ": " + e.Message);
                connected = false;
            }
            return connected;
        }
    }
}

この方法で、リポジトリ パスを「file:///Y:/repo」にすることができます。ここで、Y: は Vista にマップされた Mac ディレクトリです。

于 2009-03-17T08:21:08.737 に答える
4

別の回答では、番号のサイズに制限があるため、SVN リビジョン番号は適切ではない可能性があると述べています。

次のリンクは、SNV リビジョン番号だけでなく、日付バージョン情報テンプレートも提供します。

これを .NET プロジェクトに追加するのは簡単です。必要な作業はほとんどありません。

これは、この https://github.com/AndrewFreemantle/When-The-Version/downloadsに対処する github プロジェクトです。

次の URL の読み込みは遅いかもしれませんが、これを機能させる方法を順を追って説明しています (簡単で短い 3 つまたは 4 つのステップ)。

http://www.fatlemon.co.uk/2011/11/wtv-automatic-date-based-version-numbering-for-net-with-whentheversion/

于 2012-02-11T02:40:58.757 に答える
2

svn infoは、現在のバージョンを示します。プロジェクトのVSで「pre-build」イベントを作成して、svn infoを実行し、自家製のコマンドラインアプリで結果を解析することで、assemblyinfo.csを生成できます。

私は以前にこれを行いましたが、すぐにccnetに変数としてnantに渡すように切り替えました。

于 2008-08-15T13:51:52.243 に答える
2

プロジェクト AssemblyInfo.cs のバージョン番号を更新する場合は、次の記事に興味があるかもしれません。

CodeProject: Visual Studio プロジェクトで Subversion リビジョン番号を使用する

SVN キーワードを有効にすると、プロジェクトをチェックインするたびに、Subversion は特定の「キーワード」についてファイルをスキャンし、キーワードをいくつかの情報に置き換えます。

たとえば、ソース ファイルの先頭に、次のキーワードを含むヘッダーを作成します。

'$Author:$
'$Id:$
'$Rev:$

このファイルを Subversion にチェックインすると、これらのキーワードは次のように置き換えられます。

'$Author: paulbetteridge $
'$Id: myfile.vb 145 2008-07-16 15:24:29Z paulbetteridge $
'$Rev: 145 $

于 2008-09-12T05:48:31.607 に答える
0

すべてのプロジェクトで参照できる共有アセンブリ バージョン ファイルを使用できます。

UppercuTはこれを行います - http://ferventcoder.com/archive/2009/05/21/uppercut---automated-builds---versionbuilder.aspx

これにより、アセンブリでバージョンを取得するために何ができるかがわかります。

于 2009-06-08T16:34:24.253 に答える