Как я могу получить номер версии Subversion в PHP?

Я хочу, чтобы мое приложение PHP было помечено номером версии, которую оно использует, но я не хочу использовать CruiseControl или обновляйте файл и загружайте его каждый раз. Как я должен это делать?


person Thomaschaaf    schedule 21.09.2008    source источник


Ответы (12)


Ключевые слова SVN - не лучшее решение. Как отмечали другие, добавление $ Revision $ в файл влияет только на конкретный файл, который может не изменяться в течение длительного времени.

Бессмысленно не забывать «редактировать» файл (добавляя или удаляя пустую строку) перед каждой фиксацией. Вы также можете просто ввести версию вручную.

Один из хороших способов сделать это (о котором я знаю) - использовать автоматизированный процесс развертывания (что всегда хорошо) и использовать команду svnversion. Вот что я делаю:

Везде, где мне нужна доработка, я включаю: <?php include 'version.php'; ?>. Этот файл "version.php" имеет только номер версии. Более того, он не является частью репозитория (игнорируется). Вот как я его создаю:

1) В проектах, где на сервере установлен SVN, я также использую его для развертывания. Получение последней версии на сервер. У меня есть сценарий, который, помимо прочего, выполняет следующие функции (выполняется на сервере):

cd /var/www/project
svn update
rm version.php
svnversion > version.php

2) В проектах, где SVN не установлен, мой сценарий развертывания более сложен: он создает файл version.php локально, заархивирует код, загружает и извлекает его.

person daremon    schedule 22.09.2008
comment
Хорошая вещь в вашем ответе заключается в том, что он не зависит от языка: svnversion сохраняет номер версии в текстовом файле, и это значение требуется приложению, которое позже обращается к этому файлу. - person AxeEffect; 15.10.2013

Предполагая, что ваш веб-корневой каталог является извлеченной копией дерева подверсий, вы можете проанализировать файл /.svn/entries и получить номер ревизии (4-я строка здесь) ...

В PHP:

$svn = File('.svn/entries');
$svnrev = $svn[3];
unset($svn);
person Oli    schedule 21.09.2008
comment
Делает ваше приложение зависимым от внутренних компонентов Svn. Извини нет-нет - person Brent.Longborough; 21.09.2008
comment
@ Brent.Longborough Я бы проголосовал против вашего комментария, если бы мог, но я не могу, поэтому я оставлю этот комментарий вместо этого. - person Annika Backstrom; 03.03.2010
comment
На самом деле это выглядит более портативным, чем использование двоичного файла svnversion, который, возможно, не существует, особенно с учетом систем Windows, проверок разработчиков и т. Д. - person Christoph Strasen; 11.11.2010
comment
Я бы проголосовал за это, многие люди пропускают процесс сборки и делают svn co на производстве. В этом случае, нравится это или нет, я связан с внутренними компонентами svn, и если я связан, почему бы не использовать его. svnversion - чистый процесс, если есть этап сборки. - person shikhar; 30.12.2010
comment
Хочу отметить, что этот метод работает быстрее, чем вызов системной команды. Его легко реализовать, и он не вызовет серьезных проблем с производительностью. - person Jonathon Hill; 28.01.2011
comment
Просто чтобы указать на что-то: этот номер обновляется только при обновлении папки. - person mauris; 03.05.2011
comment
Subversion 1.7 больше не использует для этой цели файл .svn / entries; вам придется покопаться в базе данных sqlite .svn / wc.db, если в вашей целевой системе нет доступных двоичных файлов svn. - person rymo; 27.09.2012

Вот как я заставил его работать. Если ваш сервер настроен так, чтобы разрешить shell_exec И у вас установлен SVN, просто запустите:

$revision = `svnversion`;

or

$revision = shell_exec('svnversion');
person Nathan J.B.    schedule 01.07.2011
comment
Ой! Должно быть, была еще одна поздняя ночь. Спасибо! Исправлено :) - person Nathan J.B.; 03.02.2012
comment
Как это не принятый ответ. Кажется, работает отлично и намного лучше, чем любая другая схема. Вы даже можете записать cron в текстовый файл. Спасибо! Легко и идеально и именно то, что просил OP - person ladieu; 05.09.2012

Из этого ответа < / а>:

Вы можете сделать это, добавив следующее в любом месте вашего кода

$Id:$ 

Так, например, Джефф сделал:

<div id="svnrevision">svn revision: $Id:$</div>

и при проверке на сервере заменил $ Id: $ на текущий номер версии. Я также нашел эту ссылку.

Также есть $ Date: $, $ Rev: $, $ Revision: $

person Espo    schedule 21.09.2008
comment
Будьте осторожны с этим. Как упоминал Даремон, ключевое слово SVN не будет обновляться, если этот файл не будет изменен. У меня есть кодовая база, где эта информация находится в окне «О программе», которое очень редко изменяется. Я часто забываю отредактировать этот файл, чтобы обновить Rev ID. - person Matt Miller; 31.01.2009

Немного поздно, но используйте ловушку Subversion после фиксации. В папке хуков вашего репозитория создайте сценарий оболочки, подобный этому:

#!/bin/bash

REPOS="$1"
REV="$2"

cd /web/root
rm -f /web/root/templates/base.html
/usr/bin/svn update
/bin/sed -i s/REVISION/$REV/ /web/root/templates/base.html

В этом конкретном примере предполагается, что ваш действующий сайт находится в / web / root, а код разработки хранится в другом месте. Когда вы фиксируете изменение разработчика, сценарий удаляет предыдущий действующий шаблон (чтобы избежать сообщений о конфликтах), запускает обновление и заменяет вхождения REVISION в шаблоне на фактический номер версии.

Подробнее о хуках здесь

person Mark    schedule 28.04.2011

В большинстве случаев код на сервере фактически будет содержать «Экспорт» кода, а не оформление заказа, и, следовательно, не будет содержать папок .svn. По крайней мере, именно такую ​​установку я вижу чаще всего. Действительно ли другие проверяют свой код на веб-сервере?

person Kibbee    schedule 21.09.2008
comment
Нет, вы, наверное, правы. Это, вероятно, лучшее поведение и для производственного сервера ... Возможно, вы не хотите, чтобы люди шпионили за каталогами .svn. - person Oli; 21.09.2008
comment
Я надеюсь, что вы определенно запретите доступ к каталогам .svn в конфигурации вашего сервера или, по крайней мере, к .htaccess. В противном случае будет виден весь ваш код. - person Artem Russakovskii; 13.05.2009

Вы можете приблизиться с помощью Ключевые слова SVN. Добавьте $ Revision $ туда, где вы хотите отображать ревизию, но при этом будет отображаться только последняя ревизия, в которой был изменен конкретный файл, поэтому вам придется каждый раз вносить изменения в файл. Получить глобальный номер ревизии невозможно без какого-либо внешнего скрипта или ловушки после фиксации.

person noah    schedule 21.09.2008

Вы также можете сделать это так:

$status = @shell_exec('svnversion '.realpath(__FILE__));
if ( preg_match('/\d+/', $status, $match) ) {
    echo 'Revision: '.$match[0];
}
person Christoffer    schedule 27.11.2009

Самый простой способ - использовать Subversion «Подстановку ключевых слов». Есть руководство здесь в книга SVN (Контроль версий с помощью Subversion).

Вам просто нужно будет добавить текст $ Rev $ где-нибудь в вашем файле. Затем включите ключевое слово в своем репозитории. При оформлении заказа SVN подставит номер версии в файл.

person Brian Gianforcaro    schedule 21.09.2008

См. Мой ответ на аналогичный вопрос Отметить экспорт svn как ревизию.

Если вы записываете номер редакции при экспорте, вы можете использовать:

svn export /path/to/repository | grep ^Exported > revision.txt

Чтобы удалить все, кроме номера версии, вы можете передать это с помощью этой команды sed:

svn export /path/to/repository | grep ^Exported | sed 's/^[^0-9]\+\([0-9]\+\).*/\1/' > revision.txt
person fijiaaron    schedule 03.03.2010

Другая возможность сделать это - запустить cron, который выполняет шаги, описанные в «Процессе развертывания» (при условии, что это сервер * nix / FreeBSD).

person Andrei Iarus    schedule 27.11.2009

Если производительность является проблемой, вы можете сделать:

exec('svn info /path/to/repository', $output);
$svn_ver = (int) trim(substr($output[4], strpos($output[4], ':')));

Это, конечно, зависит от того, что вы выполнили проверку, и от наличия команды svn.

person Community    schedule 28.01.2011