perl - 我如何使用 beta Perl 脚本中的 beta Perl 模块?

标签 perl testing perl-module

如果我的 Perl 代码有生产代码位置和“测试版”代码位置 (例如,生产 Perl 代码在 /usr/code/scripts 中,BETA Perl 代码在 /usr/code/beta/scripts 中;生产 Perl 库在 /usr/code/lib/perl 和这些库的 BETA 版本在 /usr/code/beta/lib/perl 中,有没有一种简单的方法可以让我实现这样的设置?

具体要求是:

  • 代码在生产环境和测试版位置必须相同。

    澄清一下,要将任何代码(库或脚本)从 BETA 升级到生产环境,唯一需要做的就是从 BETA 向产品位置发出 cp 命令 - 两者文件名和文件内容必须保持相同

  • 脚本的 BETA 版本必须调用其他 BETA 脚本和 BETA 库(如果存在)或生产库(如果 BETA 库不存在)

  • 除了基本目录(/usr/code/ vs /usr/code/beta/)之外,测试版和生产版的代码路径必须相同>)

  • 脚本必须全部在同一基本目录下但它们可以在任意深度级别的子目录中(这排除了经典的use lib "$FindBin: :Bin/../lib" 31.13 部分的解决方案。使用 "Programming Perl" 的 lib)

我将介绍我们如何解决这个问题作为对这个问题的回答,但我想知道是否有更好的方法。

最佳答案

我们自己的解决方案如下:

  • 有一个库(我们称它为 BetaOrProd.pm)

    • 库必须通过“use BetaOrProd;”包含在每个脚本
    • 库必须是每个脚本中第一个 use 语句,在“use strict;”pragma 之后(如果我们使用它的话,还有“use warnings”)。包括在任何 BEGIN block 之前。
    • 库有一个包含大部分逻辑的BEGIN block
    • 库中的 BEGIN block 检查程序的目录路径(基于 $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 位置的库。

这种方法的主要缺点是:

  1. 要求每个脚本必须将“use BetaOrProd;”作为每个脚本中“use strict;"pragma.

    由于我们公司要求每个已部署的代码段都通过自动验证程序这一事实而有所缓和,自动验证程序可以检查此要求。

  2. 无法通过 /usr/code/beta/lib/perl 对 BetaOrProd.pm 进行 BETA 测试。嗯。

    通过非常彻底的单元和库集成测试缓解

关于perl - 我如何使用 beta Perl 脚本中的 beta Perl 模块?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2474588/

相关文章:

java - Selenium: 查找元素 "next to"其他元素

perl - 旧 .pl 模块与新 .pm 模块

windows - 如何在不丢失模块的情况下在 Windows 上更新 Perl?

perl - 使用 perl 将 RTF 转换为 TEXT

html - 使用 perl 和 html 的链接中的空格

perl - 如果 perl -cw 发出警告,则设置退出状态

node.js - 如何使用 zombie.js 登录 Wordpress 管理员?

asp.net - Junit 与 .Net 技术

linux - 在 block 设备上返回字节偏移量和行匹配表达式?

perl - 使用 perl 单线器的 Csh 别名在创建别名时评估,而不是在使用别名时评估