如果我的Perl代码有一个生产代码位置和一个" BETA“代码位置(例如,在/usr/code/scripts中生产Perl代码我们,BETA Perl代码在/usr/code/beta/scripts中;产品Perl库在/usr/code/lib/perl中,而这些库的BETA版本在/usr/code/beta/lib/perl中),那么有什么简单的方法可以让我实现这样的设置呢?
具体要求如下:
cp命令--文件名和文件内容必须保持相同的。/usr/code/和/usr/code/beta/)。use lib "$FindBin::Bin/../lib"解决方案)。使用"Programming Perl“的lib )我将介绍我们如何解决这个问题,作为这个问题的答案,但我想知道是否有更好的方法。
发布于 2010-03-19 02:26:46
我们自己的解决办法如下:
- The library MUST be included via "`use BetaOrProd;`" in **every script**
- The library MUST be the very first `use` statement in every script after "`use strict;`" pragma (and "use warnings" if we use that). Including before any `BEGIN` blocks.
- The library has a `BEGIN` block which contains most of the logic
- That `BEGIN` block in the library checks the program's directory path (based off of $0 with absolute path applied)
- If the directory path starts with `/usr/code/beta`, the program is deemed to run in BETA location, else in production
- In either case, `/usr/local/lib/perl` is un-shifted to the beginning of `@INC` list
- If BETA location, `/usr/code/beta/lib/perl` is un-shifted to the beginning of `@INC` list after that.
- If BETA location, a special variable $isBETA (accessible by a accessor method exported from BetaOrProd.pm) is set to "BETA".
这种方法的主要缺点是:
use BetaOrProd;“作为"use strict;”之后的每个脚本中的第一个use语句。
我们公司要求每个已部署的代码通过自动验证器,这可以检查这一需求,这一事实缓解了这种情况。/usr/code/beta/lib/perl。达恩。
通过对库进行非常彻底的单元和集成测试来缓解发布于 2010-03-19 10:59:08
我用FindBin来解决这个问题
use FindBin;
use lib "$FindBin::Bin/../lib";或者,如果污染模式是活动的:
use FindBin;
use lib ("$FindBin::Bin/../lib" =~ m[^(/.*)])[0];因为这不依赖于任何已知或固定的路径,所以它允许在一台机器上设置任意数量的独立代码集,只要创建一个新的项目目录副本即可。
我在项目的每个开发映像中都维护所有项目模块的完整副本,但听起来您不需要,而是依赖于回到活副本模块的beta版本;上面的use lib /path/to/live/bin会处理这个问题,或者您只需将/path/to/live/bin链接到@INC上的目录之一,这样它就可以立即可用。
如果实时版本和beta版本将在不同的帐户上运行,那么地方:自由联盟也可能值得一看,但这似乎并不是它的真正目的。
更新:如果脚本本身可能存在于给定目录的多个子目录中,则此操作不起作用,但以其他方式工作。
发布于 2010-03-19 04:56:56
我不得不使用类似的配置。不过,该模块是以项目名称命名的,可以执行其他一些任务:加载一些特定于环境的配置变量(例如数据位置、dev/prod数据库的凭据)、处理一些命令行参数,以及设置对项目中的大多数脚本有用的其他变量(当前的日期为YYYYMMDD格式,股票市场目前是否开放等)。
https://stackoverflow.com/questions/2474588
复制相似问题