我想让我的 PHP 应用程序标有它使用的修订号,但我不想使用CruiseControl或更新文件并每次都上传它。我该怎么做?
13 回答
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 文件,压缩代码,上传并提取它
假设您的 webroot 是 subversion 树的签出副本,您可以解析 /.svn/entries 文件并勾出修订号(此处为第 4 行)...
在 PHP 中:
$svn = File('.svn/entries');
$svnrev = $svn[3];
unset($svn);
这就是我让它工作的方式。如果您的服务器设置为允许shell_exec并且您安装了 SVN,则只需运行:
$revision = `svnversion`;
或者
$revision = shell_exec('svnversion');
现在有点晚了,但使用 Subversion 提交后挂钩。在存储库的 hooks 文件夹中,创建一个类似这样的 shell 脚本:
#!/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 文件夹。至少这是我最常看到的设置。其他人是否真的将他们的代码检查到 Web 服务器上?
最简单的方法是使用 Subversion 的“Keyword Substitution”。SVN 书中有一个指南(带有 Subversion 的版本控制)。
您基本上只需在文件中的某处添加文本 $Rev$。然后在您的存储库中启用关键字。结帐时,SVN 会将修订号替换到文件中。
您可以接近SVN 关键字。在您希望显示修订的位置添加 $Revision$,但这只会显示特定文件更改的最后一个修订,因此您每次都必须对文件进行更改。如果没有某种外部脚本或提交后挂钩,就无法获取全局修订号。
你也可以这样做:
$status = @shell_exec('svnversion '.realpath(__FILE__));
if ( preg_match('/\d+/', $status, $match) ) {
echo 'Revision: '.$match[0];
}
请参阅我对类似问题“Mark” svn export with revision的回复。
如果您在导出时捕获修订号,您可以使用:
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
$svn_rev=file_get_contents('/path.to.repository/db/current');
另一种可能的方法是运行一个 cron 来执行“部署过程”中描述的步骤(假设它是一个 *nix/FreeBSD 服务器)。
如果性能是一个问题,那么你可以这样做:
exec('svn info /path/to/repository', $output);
$svn_ver = (int) trim(substr($output[4], strpos($output[4], ':')));
这当然取决于您是否进行了结帐,以及 svn 命令的存在。