Я хочу, чтобы мое приложение PHP было помечено номером версии, которую оно использует, но я не хочу использовать CruiseControl или обновляйте файл и загружайте его каждый раз. Как я должен это делать?
Как я могу получить номер версии Subversion в PHP?
Ответы (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 локально, заархивирует код, загружает и извлекает его.
svnversion
сохраняет номер версии в текстовом файле, и это значение требуется приложению, которое позже обращается к этому файлу.
- person AxeEffect; 15.10.2013
Предполагая, что ваш веб-корневой каталог является извлеченной копией дерева подверсий, вы можете проанализировать файл /.svn/entries и получить номер ревизии (4-я строка здесь) ...
В PHP:
$svn = File('.svn/entries');
$svnrev = $svn[3];
unset($svn);
Вот как я заставил его работать. Если ваш сервер настроен так, чтобы разрешить shell_exec И у вас установлен SVN, просто запустите:
$revision = `svnversion`;
or
$revision = shell_exec('svnversion');
Вы можете сделать это, добавив следующее в любом месте вашего кода
$Id:$
Так, например, Джефф сделал:
<div id="svnrevision">svn revision: $Id:$</div>
и при проверке на сервере заменил $ Id: $ на текущий номер версии. Я также нашел эту ссылку.
Также есть $ Date: $, $ Rev: $, $ Revision: $
Немного поздно, но используйте ловушку 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 в шаблоне на фактический номер версии.
Подробнее о хуках здесь
В большинстве случаев код на сервере фактически будет содержать «Экспорт» кода, а не оформление заказа, и, следовательно, не будет содержать папок .svn. По крайней мере, именно такую установку я вижу чаще всего. Действительно ли другие проверяют свой код на веб-сервере?
Вы можете приблизиться с помощью Ключевые слова SVN. Добавьте $ Revision $ туда, где вы хотите отображать ревизию, но при этом будет отображаться только последняя ревизия, в которой был изменен конкретный файл, поэтому вам придется каждый раз вносить изменения в файл. Получить глобальный номер ревизии невозможно без какого-либо внешнего скрипта или ловушки после фиксации.
Вы также можете сделать это так:
$status = @shell_exec('svnversion '.realpath(__FILE__));
if ( preg_match('/\d+/', $status, $match) ) {
echo 'Revision: '.$match[0];
}
Самый простой способ - использовать Subversion «Подстановку ключевых слов». Есть руководство здесь в книга SVN (Контроль версий с помощью Subversion).
Вам просто нужно будет добавить текст $ Rev $ где-нибудь в вашем файле. Затем включите ключевое слово в своем репозитории. При оформлении заказа SVN подставит номер версии в файл.
См. Мой ответ на аналогичный вопрос Отметить экспорт 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
Другая возможность сделать это - запустить cron, который выполняет шаги, описанные в «Процессе развертывания» (при условии, что это сервер * nix / FreeBSD).
Если производительность является проблемой, вы можете сделать:
exec('svn info /path/to/repository', $output);
$svn_ver = (int) trim(substr($output[4], strpos($output[4], ':')));
Это, конечно, зависит от того, что вы выполнили проверку, и от наличия команды svn.