Как вы можете автоматически импортировать последний номер сборки/ревизии в subversion?
Цель состоит в том, чтобы это число было видимым на нижнем колонтитуле веб-страницы, например SO.
Как вы можете автоматически импортировать последний номер сборки/ревизии в subversion?
Цель состоит в том, чтобы это число было видимым на нижнем колонтитуле веб-страницы, например SO.
svn info <Repository-URL>
или
svn info --xml <Repository-URL>
Затем посмотрим на результат. Для xml, parse/info/entry/@revision для пересмотра репозитория (151 в этом примере) или /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>
Я написал инструмент (cmdnetsvnrev, включая исходный код) для себя, который заменяет версию в моих файлах AssemblyInfo.cs. Однако он ограничен этой целью, но, как правило, svn-информация, а затем обработка - это путь.
Попросите свой процесс сборки 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 дает более подробно. Команда "svn info" также не делает то, что вы хотите, поскольку она сообщает только состояние вашего текущего каталога, игнорируя состояние любых подкаталогов. В том же рабочем дереве, что и в предыдущем примере, у меня было несколько подкаталогов, которые были более новыми, чем каталог, в котором я был, но "svn info" не замечает:
$ svn info
... snip ...
Revision: 662
Легко включить svnversion в ваш процесс сборки, так что каждая сборка получает номер версии в некоторой доступной для выполнения форме. Например, для проекта Java у меня был makefile dump вывод svnversion в файл .properties.
Добавьте svn: keywords в свойства SVN исходного файла:
svn:keywords Revision
Затем в исходном файле укажите:
private const string REVISION = "$Revision$";
Обновление будет обновляться с номером ревизии при следующем фиксации (например,) "$Revision: 4455$"
. Вы можете проанализировать эту строку, чтобы извлечь только номер версии.
Если у вас есть черепаха SVN, вы можете использовать SubWCRev.exe
Создайте файл с именем:
RevisionInfo.tmpl
SvnRevision = $WCREV$;
Затем выполните следующую команду:
SubWCRev.exe . RevisionInfo.tmpl RevisionInfo.txt
Он создаст файл ReivisonInfo.txt с номером вашей редакции следующим образом:
SvnRevision = 5000;
Но вместо использования .txt вы можете использовать любой исходный файл, который хотите, и иметь доступ к номеру reivsion в вашем исходном коде.
Вы не говорите, какой язык/рамки программирования вы используете. Здесь, как это сделать в Python, используя 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
Используя С# и 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;
});
}
В моем последнем проекте я решил эту проблему, используя несколько инструментов: SVN, NAnt и пользовательскую задачу NAnt.
svn info --xml ./svnInfo.xml
<xmlpeek>
Разделы, связанные с версией моей сборки script, выглядят следующим образом:
<!-- 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
сообщите мне. Поскольку это было связано с проектом, связанным с работой, мне нужно будет проверить с руководством, можно ли его выпустить по дружественной (бесплатной) лицензии.
Вот подсказка, как вы можете использовать возможности Netbeans "для
создайте пользовательские ant задачи, которые будут генерировать scm-version.txt:
Откройте файл build.xml и добавьте следующий код справа после <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 до scm-version.txt каждый раз, когда вы делаете clean/build.
Вы можете прочитать файл во время выполнения, выполнив:
getClass().getResourceAsStream("scm-version.txt"); // ...
Не забудьте пометить файл scm-version.txt как svn: ignore.
В Rails я использую этот фрагмент в моей среде .rb, который дает мне константу, которую я могу использовать во всем приложении (например, в нижнем колонтитуле макета приложения).
SVN_VERSION = IO.popen("svn info").readlines[4].strip.split[1]
Ну, вы можете запустить 'svn info', чтобы определить текущий номер версии, и вы могли бы, вероятно, извлечь это довольно легко с помощью регулярного выражения, например "Редакция: ([0-9] +)".
Если вы работаете под GNU/Linux, cd в каталог рабочей копии и запускаете:
svn -u status | grep Status\ against\ revision: | awk '{print $4}'
Из моего опыта, svn-информация не дает надежных номеров после переименования каталогов.
Вам нужна подкоманда 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. 4190 - последний номер версии для репозитория, а 3397 - номер версии последнего изменения поддерева, из которого было извлечено это рабочее пространство. Вы можете указать путь к рабочей области или URL-адрес в репозиторий.
Фрагмент С# для извлечения этого под Windows выглядит примерно так:
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 как часть номера версии для сборок.)
Я использую проект Проект MSBuild Community Tasks, в котором есть инструмент для извлечения номера версии SVN и добавления его в AssemblyInfo.vb. Затем вы можете использовать отражение для извлечения этой строки, чтобы отобразить ее в пользовательском интерфейсе.
Если вы используете svnant, вы можете использовать wcVersion, который дублирует svnveresion и возвращает удобоваримые значения. видеть: http://subclipse.tigris.org/svnant/svn.html#wcVersion
Я создал плагин версии SVN для Build Version Increment на CodePlex. Этот подключаемый модуль SVN вытащит последний номер версии изменения из вашей рабочей копии и позволит вам использовать его в своем номере версии, который должен выполнить именно то, что вы пытаетесь сделать. Build Version Increment довольно гибкая и позволит вам настроить, как выполняется управление версиями несколькими способами.
BVI работает только с Visual Studio, но поскольку вы используете Asp.Net, это не будет проблемой. Это не требует написания кода или редактирования xml, поэтому yay!