【发布时间】:2010-11-11 16:54:53
【问题描述】:
如何正确地将应用程序从开发部署到生产以及如何处理多个站点配置。 我所有的开发都是通过位于 var/svn/myapp/trunk 和 实际的生产代码在 /var/www/myapp 中。
我将最新的代码签出到我的本地计算机到一个名为“myapp_latest_svn”的目录中。 我的主要 settings.php 中有特定于站点和位置的代码,其中 H_PATH = 'http://myapp.com' & db_host、db_user_name 和 db_password 的 db 配置设置,如您所知 本地机器设置(其中 localhost/myapp.com 只是一个 Apache 别名)和生产服务器(实时站点在 myapp.com 上运行)。
此外,.htaccess 文件与生产服务器上的文件不同。简而言之,开发和生产之间存在许多差异。
我将所有工作都保存在 SVN 中。每天早上我都会使用 SVN Update,它将最新的代码更新到我的本地 svn 存储库。 当我准备好上线时,我使用 svn Commit 构建一个版本。
然后在发布中,我必须记住将所有适当的开发文件更改为它们的生产对应文件。 现在我必须手动编辑生产 settings.php 和 .htaccess 以反映站点特定的更改。
我正在寻找一种从开发到生产完成版本控制和 没有手动编辑容易出错和不好的做法的文件。
一种方法是将文件的生产版本设为只读 (0444)。这样当我进行 svn 导出时, 它们不会被文件的开发版本覆盖,我不必担心在 从开发到生产的每一步。但这是做持续集成等事情的糟糕方式。
还可以制作多个 settings.php 副本(一个用于 localhost、beta 和 prod)。然后使用shell脚本 从svn导出,然后一旦导出完成,它用正确的settings.php替换settings.php, 取决于我们部署到的位置。这样,一切都是自动化的。 但这也是一种蹩脚的方式。
最后一个方法是
if( eregi ("myapp.com$", $_SERVER['HTTP_HOST']) ){
define('H_PATH', 'myapp.com');
} else {
define('H_PATH', 'localmyapp.com');
}
就 settings.php 而言,这很好。 但是 .htaccess 是什么,你不能像上面那样在 .htaccess 中检查。
我不希望每次部署站点时都必须更改设置。
我的 DB 架构不在版本控制中,所以 db 对我来说不是问题,只有 settings.php 和 .htaccess。
另外,我如何告诉 svn 不要更新某些目录,因为这也是特定于站点的(/log、/cache、/assets、/downloads)。 我还需要为上述文件保留 apache ( www_data) 的写访问权限。
最后我不想在导出时将空的主干目录和 .svn 文件复制到生产服务器。
在从 svn 构建到生产服务器时,如何使用 Phing 甚至 shell 脚本进行集成而不会导致任何这些问题。
这可能对许多想成为应用程序开发者的人有用。
提前致谢,
工作时间
【问题讨论】:
标签: php svn shell scripting phing