CC.NET を使用しない .NET アセンブリの SVN リビジョン バージョン
-
08-06-2019 - |
質問
.NET アセンブリのバージョン文字列に SVN リポジトリのリビジョン番号を含める方法はありますか?Major.Minor.SVNRev のようなもの
CC.NET のようなもの (実際には ASP.NET 上ですが) でこれを行うという言及を見たことがありますが、追加のソフトウェアなしでそれを行う方法はありますか?ビルド バッチ スクリプトを使用する前に、C/C++ で同様のことを行ったことがありますが、バージョン番号を読み取り、スクリプトに毎回次の内容を含む「ver.h」というファイルを書き出すことで実現していました。
#define MAJORVER 4
#define MINORVER 23
#define SOURCEVER 965
次に、これらの定義を使用してバージョン文字列を生成します。
.NETでもこのようなことは可能でしょうか?
解決
SubWCRev を見てください - http://tortoisesvn.net/docs/release/TortoiseSVN_en/tsvn-subwcrev.html
アセンブリのバージョン番号は通常、assemblyinfo.cs にあります。
他のヒント
アセンブリ内のリビジョン情報を自動的に更新する C# の例を次に示します。これは Will Dean による回答に基づいていますが、あまり詳しくありません。
例 :
- AssemblyInfo.csは、プロジェクトのフォルダーのAssemblyInfotemplate.csにコピーします プロパティ.
- 変更 ビルドアクション に なし AssemblyInfoTemplate.cs の場合。
AssemblyFileVersion を含む行を次のように変更します。
[assembly: AssemblyFileVersion("1.0.0.$WCREV$")]
以下を追加することを検討してください。
[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:$.")]
,これにより、アセンブリのビルド元のソースのリビジョン ステータスに関する詳細が得られます。
次のビルド前イベントをプロジェクト ファイルのプロパティに追加します。
subwcrev "$(SolutionDir)." "$(ProjectDir)Properties\AssemblyInfoTemplate.cs" "$(ProjectDir)Properties\AssemblyInfo.cs" -f
AssemblyInfo.cs を svn 無視リストに追加することを検討してください。置換されたリビジョン番号と日付によってファイルが変更され、その結果、重要ではない変更とリビジョンが発生し、$WCMODS$ は true と評価されます。もちろん、AssemblyInfo.cs はプロジェクトに含める必要があります。
Wim Coenen による反対に応えて、Darryl が提案したものとは対照的に、AssemblyFileVersion も同様であることに気付きました。 ない 2^16 を超える数値をサポートします。ビルドは完了しますが、プロパティ ファイルバージョン 実際のアセンブリでは、AssemblyFileVersion モジュロ 65536 になります。したがって、1.0.0.65536 と 1.0.0.131072 は 1.0.0.0 などになります。この例では、AssemblyInformationalVersion プロパティには常に真のリビジョン番号が存在します。これが重要な問題であると考えられる場合は、ステップ 3 を省略しても構いません。
編集:このソリューションをしばらく使用した後の追加情報。
- AssemblyInfoTemplate.cs ではなく AssemblyInfo.cst が使用されるようになりました。これは、自動的に ビルドアクション オプション なし, エラーリストが乱雑になることはありませんが、構文の強調表示が失われます。
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 になります。これは、コミットされたファイルはコミット後に先頭リビジョンにあるが、他のファイルはそうでないことが原因であると考えられます。
- 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 情報に簡単にアクセスできるようになります。
可能ですが、次のことは行わないでください。アセンブリ バージョン文字列のコンポーネントは 16 ビット数値 (最大 65535) に制限されています。Subversion のリビジョン番号は簡単にそれより大きくなる可能性があるため、ある時点でコンパイラが突然エラーを起こすようになります。
以下のドキュメントを読んだりざっと読んだりしてください:
DotSVN を使用した .NET からの Subversion リポジトリへのアクセス
C# AssemblyInfo ファイルに SVN バージョンとビルド番号を挿入します。
Microsoft Build Engine のカスタム タスクを使用したアプリのコンパイル
3 番目のリファレンスで説明されている MSBuildCommunityTasks svnversion は、Mac 10.5.6 および VS2008 C# プロジェクトをホストしている Parallels 内 (つまり、OS 全体) の svn では実行されません。
DotSVN を使用してリポジトリからリビジョンを取得する独自のタスクを作成します。
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 ディレクトリです。
別の回答では、数値のサイズに制限があるため、SVN リビジョン番号は良い考えではない可能性があると述べています。
次のリンクでは、SNV リビジョン番号だけでなく、日付バージョン情報テンプレートも提供されます。
これを .NET プロジェクトに追加するのは簡単です。必要な作業はほとんどありません。
これに対処する github プロジェクトは次のとおりですhttps://github.com/AndrewFreemantle/When-The-Version/downloads
次の URL は読み込みに時間がかかる場合がありますが、これを機能させる方法を段階的に説明しています (簡単で短い 3 つまたは 4 つのステップ)。
svn info は、使用しているバージョンを示します。プロジェクトの VS で「ビルド前」イベントを作成し、svn info を実行し、その結果を自家製コマンド ライン アプリで解析することで、assemblyinfo.cs を生成できます。
以前にもこれを行ったことがありますが、すぐに ccnet がそれを変数として nant に渡すように変更しました。
プロジェクト AssemblyInfo.cs のバージョン番号を更新したい場合は、次の記事に興味があるかもしれません。
コードプロジェクト:Visual Studio プロジェクトで Subversion リビジョン番号を使用する
SVN キーワードを有効にすると、プロジェクトをチェックインするたびに、Subversion がファイルをスキャンして特定の「キーワード」を探し、キーワードを何らかの情報に置き換えます。
たとえば、ソース ファイルの先頭に、次のキーワードを含むヘッダーを作成します。
'$著者:$
'$ID:$
'$Rev:$このファイルを Subversion にチェックインすると、これらのキーワードは次のように置き換えられます。
'$作者:ポールベッターリッジ $
'$ID:myfile.vb 145 2008-07-16 15:24:29Z ポールベットリッジ $
'$Rev:145ドル
すべてのプロジェクトで参照できる共有アセンブリ バージョン ファイルを使用できます。
アッパーカット これをします - http://ferventcoder.com/archive/2009/05/21/uppercut---automated-builds---versionbuilder.aspx
これにより、アセンブリでバージョンを取得するために何ができるかがわかります。