(例如,生成Perl在/usr/code / scripts中编码,BETA Perl代码在/usr/code / beta / scripts中;生成Perl库在/usr/code / lib / perl中,这些库的BETA版本在/中usr / code / beta / lib / perl,有没有简单的方法让我实现这样的设置?
具体要求是:
>代码必须是生产和BETA位置的相同.
为了澄清,为了将任何代码(库或脚本)从BETA推广到生产,需要发生的唯一事情就是从BETA到prod位置发出cp命令 – 文件名和文件内容必须保持相同.
> BETA版本的脚本必须调用其他BETA脚本和BETA库(如果存在)或生产库(如果BETA库不存在)
>除了基本目录(/usr/code / vs /usr/code / beta /)之外,BETA和生产之间的代码路径必须相同
>脚本必须全部位于相同的基本目录下,但它们可能位于任意深度级别的子目录中(这排除了第31.13节中经典的使用lib“$FindBin :: Bin /../ lib”解决方案.使用lib “编程Perl”)
解决方法
>有一个图书馆(我们称之为BetaOrProd.pm)
>必须通过“使用BetaOrProd”包含库.在每个脚本中
>在“use strict”之后,库必须是每个脚本中的第一个使用语句.编译指示(如果我们使用它,则使用“警告”).包括任何BEGIN块之前.
>库有一个BEGIN块,其中包含大部分逻辑
>库中的BEGIN块检查程序的目录路径(基于$0并且应用了绝对路径)
>如果目录路径以/usr/code / beta开头,则认为该程序在BETA位置运行,否则在生产中运行
>在任何一种情况下,/usr/local / lib / perl都不会移位到@INC列表的开头
>如果BETA位置,/usr/code / beta / lib / perl在此之后未被转移到@INC列表的开头.
>如果BETA位置,则特殊变量$isBETA(可通过从BetaOrProd.pm导出的访问器方法访问)设置为“BETA”.
>只要脚本/库需要调用另一个脚本,就会根据从BetaOrProd.pm导出的$isBETA变量的访问器来计算被调用脚本的路径.
>无论何时需要或使用Perl库,都不需要特殊的逻辑 – 由BetaOrProd.pm修改的@INC负责了解模块的导入位置.如果模块位于BETA位置,那么BETA位置的库将被BETA脚本使用,否则库将来自prod位置.
这种方法的主要缺点是:
>要求每个脚本都必须“使用BetaOrProd;”作为“use strict”之后每个脚本中的第一个使用语句附注.
我们公司要求每个部署的代码都通过自动验证器,这可以检查这一要求,从而减轻了这一缺陷.
>不能通过/usr/code / beta / lib / perl测试BetaArProd.pm. D’呃.
通过对库的非常彻底的单元和集成测试来缓解