Wie können Sie automatisch die neueste Build/Revisionsnummer in Subversion importieren?Wie kann auf die aktuelle Build-Nummer von Subversion zugegriffen werden?
Das Ziel wäre, diese Nummer wie SO auf Ihrer Webseiten-Fußzeile sichtbar zu machen.
Wie können Sie automatisch die neueste Build/Revisionsnummer in Subversion importieren?Wie kann auf die aktuelle Build-Nummer von Subversion zugegriffen werden?
Das Ziel wäre, diese Nummer wie SO auf Ihrer Webseiten-Fußzeile sichtbar zu machen.
svn info <Repository-URL>
oder
svn info --xml <Repository-URL>
auf das Ergebnis schauen dann. Für xml, parse/info/entry/@ revision für die Revision des Repositories (151 in diesem Beispiel) oder/info/entry/commit/@ revision für die Revision des letzten Commits gegen diesen Pfad (133, nützlich beim Arbeiten mit Tags):
<?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>
ich schrieb ein Werkzeug (cmdnetsvnrev, Quellcode enthalten) für mich, die die Revision in meine AssemblyInfo.cs Dateien ersetzt. Es ist zwar auf diesen Zweck beschränkt, aber in der Regel Svn Info und Verarbeitung ist der Weg zu gehen.
Nun, Sie können 'svn info' ausführen, um die aktuelle Revisionsnummer zu ermitteln, und Sie könnten das wahrscheinlich ziemlich einfach mit einer Regex, wie "Revision: ([0-9] +)" extrahieren.
Wenn Sie Schildkröte SVN haben, können Sie SubWCRev.exe verwenden
Erstellen Sie eine Datei namens:
RevisionInfo.tmpl
SvnRevision = $WCREV$;
Dann diesen Befehl ausführen:
SubWCRev.exe . RevisionInfo.tmpl RevisionInfo.txt
Es wird eine Datei ReivisonInfo.txt mit Ihrer Revisionsnummer wie folgt erstellt:
Anstatt jedoch die .txt-Datei zu verwenden, können Sie die gewünschte Quelldatei verwenden und auf die Reivennummer innerhalb Ihres Quellcodes zugreifen.
Add svn: keywords auf die SVN Eigenschaften der Quelldatei:
svn:keywords Revision
Dann in der Quelldatei enthalten:
private const string REVISION = "$Revision$";
Die Revision wird mit der Revisionsnummer beim nächsten aktualisiert werden (z. B.) "$Revision: 4455$"
. Sie können diese Zeichenfolge analysieren, um nur die Revisionsnummer zu extrahieren.
Eine Frage dazu: Ich habe festgestellt, dass $ Revision $ nur aktualisiert wird, wenn sich diese bestimmte Datei ändert, ansonsten bleibt sie unverändert. Gibt es eine Möglichkeit, $ Revision $ bei jedem Ein-/Auschecken zu erzwingen, unabhängig davon, ob die Datei beim letzten Commit geändert wurde oder nicht? –
Nein, Sie müssen eine Datei ändern und festlegen, dass dies funktioniert. Ich habe immer gerade die REVISION const in die Datei aufgenommen, die die Versionsnummer oder Versionshinweise enthält, die normalerweise vor einer Veröffentlichung sowieso aktualisiert werden. –
Wie würden Sie das tun, wenn die Datei eine .js-Datei ist? – jamesfzhang
Wenn Sie unter GNU/Linux laufen, cd in das Verzeichnis der Arbeitskopie und auszuführen:
svn -u status | grep Status\ against\ revision: | awk '{print $4}'
Aus meiner Erfahrung svn info nicht zuverlässig Zahlen nicht geben, nachdem Verzeichnisse umbenennen.
Und wie immer 'grep foo | awk '{bar}' kann am nützlichsten in 'awk '/ foo/{bar}'' - 'svn -u status | awk '/ Status gegen Revision:/{print $ 4}' – tripleee
Sie sagen nicht, welche Programmiersprache/Framework Sie verwenden.Hier ist, wie es in Python zu tun mit 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
Sie wollen die Subversion info subcommand wie folgt:
$ 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)
In diesem Fall gibt es zwei Revisionsnummern: 4190 und 3397. 4190 ist die letzte Revisionsnummer für das Repository und 3397 ist die Revisionsnummer der letzten Änderung des Teilbaums, von dem dieser Arbeitsbereich ausgecheckt wurde. Sie können einen Pfad zu einem Arbeitsbereich oder eine URL zu einem Repository angeben.
AC# Fragment dies unter Windows zu extrahieren etwas würde wie folgt aussehen:
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;
}
}
}
(. In meinem Fall verwenden wir die Subversion Revision als Teil der Versionsnummer für Baugruppen)
Verwendung C# und SharpSvn (von http://sharpsvn.net) würde der Code:
//using SharpSvn;
long revision = -1;
using(SvnClient client = new SvnClient())
{
client.Info(path,
delegate(object sender, SvnInfoEventArgs e)
{
revision = e.Revision;
});
}
Haben Sie Ihren Build-Prozess den svnversion Befehl aufrufen und einbetten seine Ausgabe in generierte {source | binaries}. Dies gibt nicht nur die aktuelle Revision (wie viele andere Beispiele hier), sondern sein Ausgabe-String zeigt auch an, ob ein Build in einem gemischten Baum oder einem Baum gemacht wird, der nicht exakt mit der betreffenden Revisionsnummer übereinstimmt (d. H ein Baum mit lokalen Änderungen).
Mit einem Standard-Baum:
$ svnversion
3846
Mit einem modifizierten Baum:
$ echo 'foo' >> project-ext.dtd
$ svnversion
3846M
Mit einer gemischten Revisionen, modifizierte Baum:
$ (cd doc; svn up >/dev/null 2>/dev/null)
$ svnversion
3846:4182M
eine Idee, wie Sie es bekommen können, um die Versionen von irgendwelchen Externals auch aufzulisten? – ShoeLace
@ShoeLace - Nicht mit svnversion, leider - aber ein bisschen grep und awk arbeiten am svn status --verbose wird dich bekommen, was du suchst. –
@ShoeLace, ... btw, um das zu aktualisieren - heute würde ich 'svn status --verbose --xml' verwenden, mit XMLStarlet oder einer XSLT-Template-Nachbearbeitung. –
In meinem neuesten Projekt gelöst I Dieses Problem wird durch mehrere Tools, SVN, NAnt und eine benutzerdefinierte NAnt-Task.
svn info --xml ./svnInfo.xml
<xmlpeek>
Die Version verwandte Abschnitte meines Build-Skript wie folgt aussehen:
<!-- 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}"/>
Der Kredit für den regulären Ausdruck geht an: http://code.mattgriffith.net/UpdateVersion/. Ich habe jedoch festgestellt, dass UpdateVersion meine Anforderungen nicht erfüllt hat, da das Pin-Feature in meinem Build defekt war. Daher die benutzerdefinierte NAnt-Aufgabe.
Wenn jemand in den Code interessiert ist, für die benutzerdefinierte NAnt replace
Aufgabe lassen Sie es mich wissen. Da dies für ein Arbeitsprojekt war, muss ich mit dem Management überprüfen, ob wir es unter einer freundlichen (kostenlosen) Lizenz veröffentlichen können.
Der Befehl svnversion
ist der richtige Weg, dies zu tun. Es gibt die Revisionsnummer aus, mit der sich Ihre gesamte Arbeitskopie befindet, oder eine Reihe von Revisionen, wenn Ihre Arbeitskopie gemischt ist (z. B. sind einige Verzeichnisse aktuell und andere nicht). Es zeigt auch an, ob die Arbeitskopie lokale Änderungen aufweist. Zum Beispiel in einem ziemlich unsauberen Arbeitsverzeichnis:
$ svnversion
662:738M
Die $ Revision $ Schlüsselwort nicht tut, was Sie wollen: es ändert sich nur, wenn die Datei enthält, der Fall ist. Das Subversion-Buch gibt more detail. Der "svn info" -Befehl tut auch nicht das, was Sie wollen, da er Ihnen nur den Status Ihres aktuellen Verzeichnisses mitteilt und den Zustand von Unterverzeichnissen ignoriert. Im gleichen Arbeits Baum wie im vorherigen Beispiel, ich einige Unterverzeichnisse hatte, die als das Verzeichnis neuere war ich war, aber „svn info“ nicht bemerkt:
$ svn info
... snip ...
Revision: 662
Es ist einfach svnversion in Ihren Build-Prozess zu integrieren , so dass jeder Build die Revisionsnummer in einer für die Laufzeit zugänglichen Form erhält. Für ein Java-Projekt zum Beispiel ließ ich unser Makefile die svnversion-Ausgabe in eine .properties-Datei ablegen.
Bitte akzeptieren Sie meine Entschuldigung für den nun umgekehrten Downvote. Zu der Zeit betrachtete ich diesen platformistischen Ansatz - aber er fügt neue Inhalte hinzu (erklärt die Einschränkungen von $ Revision $, was die Verwendung eines Makefiles nahelegt), ohne einen Text wörtlich zu kopieren, also ist es völlig legitim Antworten. –
In Rails verwende ich dieses Snippet in meiner environment.rb, die mir eine Konstante gibt, die ich in der ganzen Anwendung verwenden kann (wie in der Fußzeile eines Anwendungslayouts).
SVN_VERSION = IO.popen("svn info").readlines[4].strip.split[1]
Wow, so einfach ist das. Vielen Dank! – Jaryl
Hier ist ein Hinweis, wie Sie Netbeans 'Fähigkeiten
erstellen benutzerdefinierte ant Aufgaben verwenden könnte, die scm-version.txt erzeugen würde:
Öffnen Sie Ihre build.xml Datei, und fügen Sie folgenden Code rechts nach
<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 mehreren Geschäften die Subversion Version String zu scm-version.txt jedes Mal wenn Sie sauber/bauen machen.
Sie können die Datei während der Laufzeit lesen, indem Sie:
getClass().getResourceAsStream("scm-version.txt"); // ...
Sie die Datei scm-version.txt als svn nicht vergessen zu markieren: ignorieren.
Ich verwende das MSBuild Community Tasks Projekt, das über ein Tool verfügt, um die SVN-Revisionsnummer abzurufen und zu Ihrer AssemblyInfo.vb hinzuzufügen. Sie können dann mithilfe der Reflektion diese Zeichenfolge abrufen, um sie in Ihrer Benutzeroberfläche anzuzeigen.
Hier ist ein full blog post with instructions.
Wenn Sie svnant verwenden, können Sie wcVersion verwenden, das svnveresion dupliziert und verdauliche Werte zurückgibt. siehe: http://subclipse.tigris.org/svnant/svn.html#wcVersion
Ich habe ein SVN version plug-in für das Build Version Increment Projekt auf CodePlex erstellt.Dieses SVN-Plug-In zieht die letzte Änderungsversionsnummer aus Ihrer Arbeitskopie und ermöglicht Ihnen, diese in Ihrer Versionsnummer zu verwenden, was genau das erreichen sollte, was Sie tun möchten. Build Version Increment ist ziemlich flexibel und ermöglicht es Ihnen, die Versionierung auf verschiedene Arten einzurichten.
BVI funktioniert nur mit Visual Studio, aber da Sie Asp.Net verwenden, wird das kein Problem sein. Es erfordert keinen Code zu schreiben oder XML zu bearbeiten, also yay!
'svn info | sed -n 's/^ Revision: // p'' – tripleee