Perl 如何使用subversion部署web应用程序?
我们是一个由4名开发人员组成的小型团队,负责开发web应用程序。我们在共享服务器上使用trac+svn进行版本控制和票务处理,我们对此感到高兴和满意。同一个共享服务器也托管我们的web应用程序。该应用程序本身是一个Perl CGI应用程序,它使用CGI::application和中等数量的标准(CPAN)和自定义Perl模块,这些模块安装在通常的(/usr/lib/Perl…)和一些不常见的位置(/home/user/lib/Perl…)。虽然大致的细节可能无关紧要,但最重要的一点是,开发机器上库的位置/布局与生产(共享)服务器上的位置/布局不同。我们必须接受这一事实。不过,所有开发机器上的库布局都是相同的 以下是我和我的同事遵循的典型但明显次优的工作周期:Perl 如何使用subversion部署web应用程序?,perl,svn,web-applications,Perl,Svn,Web Applications,我们是一个由4名开发人员组成的小型团队,负责开发web应用程序。我们在共享服务器上使用trac+svn进行版本控制和票务处理,我们对此感到高兴和满意。同一个共享服务器也托管我们的web应用程序。该应用程序本身是一个Perl CGI应用程序,它使用CGI::application和中等数量的标准(CPAN)和自定义Perl模块,这些模块安装在通常的(/usr/lib/Perl…)和一些不常见的位置(/home/user/lib/Perl…)。虽然大致的细节可能无关紧要,但最重要的一点是,开发机器上
svn export
”导出到服务器的相应文档根目录中svn导出
并以自动方式修复库位置?或者是有什么完全不同于我们目前所做的方式来处理这种情况
感谢您的关注如果这是一个Linux机器,您可以编写一个cron作业来为您解决这个问题。您可以使用sed/awk替换代码中所需的字符串,svn导出可以在cron作业中正常工作。您可能需要维护脚本,但它似乎比每次手工操作都要快。保留一个配置文件(例如config.pl),其中存储所有依赖于系统的路径和变量。然后在此文件上设置属性,使其永远不会提交。这将允许您轻松地为每个系统保留一个与提交树分离的本地配置脚本。如果您无法在生产中镜像您的开发服务器,为什么不能在开发中镜像您的生产服务器?这可能需要一些重新配置,但风险是什么?一切都已检查到svn 但也许这真的,真的不是你的选择。我对部署web应用程序的偏好是执行svn签出,然后运行符号链接脚本。其思想是编写一个规则系统,将一个文件夹的内容逻辑映射到另一个文件夹的内容。当然,如果您在文档根目录中删除文件夹符号链接,您必须告诉Apache遵循它们 坦率地说,最安全的方案是设置一个虚拟机,您可以像生产机器一样进行配置。通过这种方式,您可以实际测试部署脚本的内容并提交票据。然后,当发现问题时,修改脚本,使开发部署更有可能遵循新的和改进的过程
另外,作为旁注:我更喜欢使用svn签出,而不是svn导出。确保apache或您的web服务器不具有对.svn文件夹的权限并不难(尤其是在使用部署脚本时)。理想情况下,使svn回滚成为一行命令所能做的任何事情都是绝对关键的。您应该拥有可以从本地框运行的脚本。我的总是看起来像:
$> checkout from source or copy from working
$> run sed/perl -pi/copy to convert configs to the production values
(ie cp production.config myconfig)
$> upload to web server (rsync/ssh/ftp/etc)
$> ssh $SERVER migrate_db, set permissions, run unit tests, etc
最后一个需要ssh访问,我一直在寻找,但其他一切都可以在本地完成。通常会有一组开发人员配置和一组生产人员配置(或从开发人员转换为生产人员的脚本)
一步上传总是一个好主意。对于手工编辑部分,我会在Subversion中有一个单独的分支,用于您需要的本地修改。开发人员会提交到主干中,当您需要部署时,使用“svn merge”或svnmerge.py将更改从主干合并到分支 第一次创建分支后,在其中进行本地修改 在服务器上,将DocumentRoot和/usr/lib/perl和/home/user/lib/perl中的目录从分支签出 不要使用svn导出,只需签出即可“cd/usr/lib/perl;svn up” 要注意的一点是不要在DocumentRoot中公开.svn目录,请使用以下方法:
# Prevent any access to .svn directories.
<DirectoryMatch "^/.*/\.svn/">
Options None
AllowOverride None
Order allow,deny
Deny from all
</DirectoryMatch>
#阻止对.svn目录的任何访问。
选项无
不允许超限
命令允许,拒绝
全盘否定
在DocumentRoot中部署工作副本也很好,如果您需要回滚更改,只需“svn up-r PREV”。CodeVersion提供企业级subversion和trac on demand。此外,我们现在可以通过ftp、scp、rsync和许多其他方法一键发布/部署您的代码。这将是一种简单而快速的方法让你完成你想做的事 请参阅我们的CodeVision Publisher功能:
我看到的唯一问题是,您需要开发的东西不是源代码管理。您必须将该文件保存在某个地方,并在设置新的开发框时将该文件提供给用户。我在编写该答案时假设每个开发系统的配置不同。如果不是,则可以跟踪一组“通用”配置脚本,并为您的系统创建一个符号链接。一般来说,这是一个很好的建议。但在Perl中,库位置(包括、继承等)是在编译时解析的,需要特殊处理,而从配置文件读取可能不允许。这将