Subversionで最新のビルド/リビジョン番号を自動的にインポートするにはどうすればよいですか?
目標は、SOのように、その番号をWebページのフッターに表示することです。
svn info <Repository-URL>
または
svn info --xml <Repository-URL>
次に、結果を見てください。 xmlの場合、リポジトリのリビジョン(この例では151)の場合は/ info/entry/@ Revisionを解析し、このパスに対する最後のコミットのリビジョンの場合は/ info/entry/commit/@ revisionを解析します(133、タグ):
<?xml version="1.0"?>
<info>
<entry
kind="dir"
path="cmdtools"
revision="151">
<url>http://myserver/svn/stumde/cmdtools</url>
<repository>
<root>http://myserver/svn/stumde</root>
<uuid>a148ce7d-da11-c240-b47f-6810ff02934c</uuid>
</repository>
<commit
revision="133">
<author>mstum</author>
<date>2008-07-12T17:09:08.315246Z</date>
</commit>
</entry>
</info>
AssemblyInfo.csファイルのリビジョンを置き換えるツール( cmdnetsvnrev 、ソースコードを含む)を自分で作成しました。それはその目的に限定されていますが、一般的にはsvninfoとその後の処理が進むべき道です。
ビルドプロセスで svnversion コマンドを呼び出し、その出力を生成された{source | binaries}に埋め込みます。これにより、現在のリビジョンが得られるだけでなく(ここにある他の多くの例のように)、その出力文字列は、ビルドが混合ツリーで行われているか、問題のリビジョン番号と正確に一致しないツリーで行われているかを示します(つまり、 。ローカルに変更されたツリー)。
標準ツリーの場合:
$ svnversion
3846
変更されたツリーの場合:
$ echo 'foo' >> project-ext.dtd
$ svnversion
3846M
混合リビジョンの変更されたツリーの場合:
$ (cd doc; svn up >/dev/null 2>/dev/null)
$ svnversion
3846:4182M
svnversion
コマンドは、これを行う正しい方法です。作業コピー全体のリビジョン番号、または作業コピーが混在している場合はリビジョンの範囲を出力します(たとえば、一部のディレクトリは最新で、一部は最新ではありません)。また、作業コピーにローカルの変更があるかどうかも示します。たとえば、かなり汚れた作業ディレクトリでは、次のようになります。
$ svnversion
662:738M
$ Revision $キーワードは、期待どおりに機能しません。含まれているファイルが機能する場合にのみ変更されます。 Subversionの本は 詳細 を提供します。 「svninfo」コマンドも、サブディレクトリの状態を無視して、現在のディレクトリの状態を通知するだけなので、必要な処理を実行しません。前の例と同じ作業ツリーに、自分がいたディレクトリよりも新しいサブディレクトリがいくつかありましたが、「svninfo」は次のことに気づきません。
$ svn info
... snip ...
Revision: 662
Svnversionをビルドプロセスに組み込むのは簡単なので、各ビルドは実行時にアクセス可能な形式でリビジョン番号を取得します。たとえば、Javaプロジェクトの場合、makefileにsvnversion出力を.propertiesファイルにダンプさせました。
ソースファイルのSVNプロパティにsvn:keywordsを追加します。
svn:keywords Revision
次に、ソースファイルに次のものを含めます。
private const string REVISION = "$Revision$";
リビジョンは、次のコミット時にリビジョン番号で更新されます(例:)"$Revision: 4455$"
。この文字列を解析して、リビジョン番号だけを抽出できます。
Tortoise SVNをお持ちの場合は、SubWCRev.exeを使用できます
次のファイルを作成します。
RevisionInfo.tmpl
SvnRevision = $WCREV$;
次に、次のコマンドを実行します。
SubWCRev.exe . RevisionInfo.tmpl RevisionInfo.txt
次のように、リビジョン番号を含むファイルReivisonInfo.txtが作成されます。
SvnRevision = 5000;
ただし、.txtを使用する代わりに、任意のソースファイルを使用して、ソースコード内のreivsion番号にアクセスできます。
使用しているプログラミング言語/フレームワークはわかりません。 Python using PySVN でそれを行う方法は次のとおりです
import pysvn
repo = REPOSITORY_LOCATION
rev = pysvn.Revision( pysvn.opt_revision_kind.head )
client = pysvn.Client()
info = client.info2(repo,revision=rev,recurse=False)
revno = info[0][1].rev.number # revision number as an integer
C#とSharpSvn( http://sharpsvn.net から)を使用すると、コードは次のようになります。
//using SharpSvn;
long revision = -1;
using(SvnClient client = new SvnClient())
{
client.Info(path,
delegate(object sender, SvnInfoEventArgs e)
{
revision = e.Revision;
});
}
ここにヒントがあります。Netbeans '機能を使用して
create カスタムantタスクこれはscm-version.txtを生成します:
build.xmlファイルを開き、次のコードを正しく追加しますafter<import file="nbproject/build-impl.xml"/>
<!-- STORE Subversion BUILD STRING -->
<target name="-pre-compile">
<exec executable="svnversion"
output="${src.dir}/YOUR/PACKAGE/NAME/scm-version.txt"/>
</target>
これで、NetbeansはSubversionバージョン文字列をclean/buildにするたびにscm-version.txtに変換します。
次の手順を実行すると、実行時にファイルを読み取ることができます。
getClass().getResourceAsStream("scm-version.txt"); // ...
ファイルをscm-version.txtとしてsvn:ignoreとしてマークすることを忘れないでください。
私の最新のプロジェクトでは、いくつかのツール、SVN、NAnt、およびカスタムNAntタスクを使用してこの問題を解決しました。
svn info --xml ./svnInfo.xml
を実行します<xmlpeek>
でxmlファイルからリビジョン番号をプルしますビルドスクリプトのバージョン関連セクションは次のようになります。
<!-- Retrieve the current revision number for the working directory -->
<exec program="svn" commandline='info --xml' output="./svnInfo.xml" failonerror="false"/>
<xmlpeek file="./svnInfo.xml" xpath="info/entry/@revision" property="build.version.revision" if="${file::exists('./svnInfo.xml')}"/>
<!-- Custom NAnt task to replace strings matching a pattern with a specific value -->
<replace file="${filename}"
pattern="AssemblyVersion(?:Attribute)?\(\s*?\"(?<version>(?<major>[0-9]+)\.(?<minor>[0-9]+)\.(?<build>[0-9]+)\.(?<revision>[0-9]+))\"\s*?\)"
value="AssemblyVersion(${build.version})"
outfile="${filename}"/>
正規表現のクレジットは次のようになります: http://code.mattgriffith.net/UpdateVersion/ 。しかし、私が持っていたビルドでピン機能が壊れていたため、UpdateVersionが私のニーズを満たしていないことがわかりました。したがって、カスタムNAntタスク。
誰かがコードに興味があるなら、カスタムNAnt replace
タスクのために私に知らせてください。これは仕事関連のプロジェクトのためだったので、友好的な(無料の)ライセンスの下でリリースできるかどうかを経営陣に確認する必要があります。
In Railsこのスニペットをenvironment.rbで使用します。これにより、アプリケーション全体で使用できる定数が得られます(アプリケーションレイアウトのフッターなど)。
SVN_VERSION = IO.popen("svn info").readlines[4].strip.split[1]
'svn info'を実行して現在のリビジョン番号を確認できます。おそらく、「Revision:([0-9] +)」のような正規表現を使用して簡単に抽出できます。
GNU/Linuxで実行している場合は、作業コピーのディレクトリにcdして、次のコマンドを実行します。
svn-uステータス| grep Status\Against \リビジョン:| awk '{print $ 4}'
私の経験から、ディレクトリの名前を変更した後、svninfoは信頼できる番号を提供しません。
CodePlexで Build Version Increment プロジェクト用に SVNバージョンプラグイン を作成しました。このSVNプラグインは、作業コピーから最新の変更リビジョン番号を取得し、それをバージョン番号で使用できるようにします。これにより、実行しようとしていることを正確に実行できます。 Build Version Incrementは非常に柔軟性があり、さまざまな方法でバージョン管理を行う方法を設定できます。
BVIはVisualStudioでのみ機能しますが、Asp.Netを使用しているため、問題はありません。コードを書いたり、xmlを編集したりする必要はないので、イェーイ!
私は MSBuild Community Tasks プロジェクトを使用します。このプロジェクトには、SVNリビジョン番号を取得してAssemblyInfo.vbに追加するツールがあります。次に、リフレクションを使用してこの文字列を取得し、UIに表示できます。
これが 説明付きの完全なブログ投稿 です。
svnantを使用している場合は、wcVersionを使用できます。これは、svnveresionを複製し、消化可能な値を返します。参照: http://subclipse.tigris.org/svnant/svn.html#wcVersion
次のように、Subversion infoサブコマンドが必要です。
$ svn info .
Path: .
URL: http://trac-hacks.org/svn/tracdeveloperplugin/trunk
Repository Root: http://trac-hacks.org/svn
Repository UUID: 7322e99d-02ea-0310-aa39-e9a107903beb
Revision: 4190
Node Kind: directory
Schedule: normal
Last Changed Author: coderanger
Last Changed Rev: 3397
Last Changed Date: 2008-03-19 00:49:02 -0400 (Wed, 19 Mar 2008)
この場合、4190と3397の2つのリビジョン番号があります。4190はリポジトリの最後のリビジョン番号であり、3397はこのワークスペースがチェックアウトされたサブツリーへの最後の変更のリビジョン番号です。ワークスペースへのパス、またはリポジトリへのURLを指定できます。
Windowsでこれを抽出するためのC#フラグメントは、次のようになります。
Process process = new Process();
process.StartInfo.FileName = @"svn.exe";
process.StartInfo.Arguments = String.Format(@"info {0}", path);
process.StartInfo.UseShellExecute = false;
process.StartInfo.RedirectStandardOutput = true;
process.Start();
// Parse the svn info output for something like "Last Changed Rev: 1234"
using (StreamReader output = process.StandardOutput)
{
Regex LCR = new Regex(@"Last Changed Rev: (\d+)");
string line;
while ((line = output.ReadLine()) != null)
{
Match match = LCR.Match(line);
if (match.Success)
{
revision = match.Groups[1].Value;
}
}
}
(私の場合、アセンブリのバージョン番号の一部としてSubversionリビジョンを使用します。)