首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用beta Perl脚本中的beta Perl模块?

如何使用beta Perl脚本中的beta Perl模块?
EN

Stack Overflow用户
提问于 2010-03-19 02:14:49
回答 3查看 508关注 0票数 6

如果我的Perl代码有一个生产代码位置和一个" BETA“代码位置(例如,在/usr/code/scripts中生产Perl代码我们,BETA Perl代码在/usr/code/beta/scripts中;产品Perl库在/usr/code/lib/perl中,而这些库的BETA版本在/usr/code/beta/lib/perl中),那么有什么简单的方法可以让我实现这样的设置呢?

具体要求如下:

  • 代码在生产和测试位置上必须是相同的。 为了澄清,要将任何代码(库或脚本)从BETA推广到生产,唯一需要发生的事情就是从BETA到prod location发出cp命令--文件名和文件内容必须保持相同的
  • BETA版本的脚本必须调用其他BETA脚本和BETA库(如果存在)或产品库(如果没有BETA库)
  • 测试和生产之间的代码路径必须相同,但基本目录除外(/usr/code//usr/code/beta/)。
  • 脚本必须位于相同的基本目录下,但它们可能位于任意深度级别的子目录中(这就排除了31.13节中的经典use lib "$FindBin::Bin/../lib"解决方案)。使用"Programming Perl“的lib )

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-03-19 02:26:46

我们自己的解决办法如下:

  • 有一个库(让我们称之为BetaOrProd.pm)
代码语言:javascript
复制
- 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".

  • 每当脚本/库需要调用另一个脚本时,调用脚本的路径都是根据从$isBETA导出的BetaOrProd.pm变量的上述访问器来计算的。
  • 无论何时需要或使用Perl库,都不需要特殊的逻辑--由BetaOrProd.pm修改的BetaOrProd.pm负责了解从哪里导入模块。如果模块位于BETA位置,则BETA位置的库将由BETA脚本使用,否则由prod位置的库使用。

这种方法的主要缺点是:

  1. 要求每个脚本必须将"use BetaOrProd;“作为"use strict;”之后的每个脚本中的第一个use语句。 我们公司要求每个已部署的代码通过自动验证器,这可以检查这一需求,这一事实缓解了这种情况。
  2. 不能通过BetaOrProd.pm测试/usr/code/beta/lib/perl。达恩。 通过对库进行非常彻底的单元和集成测试来缓解
票数 3
EN

Stack Overflow用户

发布于 2010-03-19 10:59:08

我用FindBin来解决这个问题

代码语言:javascript
复制
use FindBin;
use lib "$FindBin::Bin/../lib";

或者,如果污染模式是活动的:

代码语言:javascript
复制
use FindBin;
use lib ("$FindBin::Bin/../lib" =~ m[^(/.*)])[0];

因为这不依赖于任何已知或固定的路径,所以它允许在一台机器上设置任意数量的独立代码集,只要创建一个新的项目目录副本即可。

我在项目的每个开发映像中都维护所有项目模块的完整副本,但听起来您不需要,而是依赖于回到活副本模块的beta版本;上面的use lib /path/to/live/bin会处理这个问题,或者您只需将/path/to/live/bin链接到@INC上的目录之一,这样它就可以立即可用。

如果实时版本和beta版本将在不同的帐户上运行,那么地方:自由联盟也可能值得一看,但这似乎并不是它的真正目的。

更新:如果脚本本身可能存在于给定目录的多个子目录中,则此操作不起作用,但以其他方式工作。

票数 2
EN

Stack Overflow用户

发布于 2010-03-19 04:56:56

我不得不使用类似的配置。不过,该模块是以项目名称命名的,可以执行其他一些任务:加载一些特定于环境的配置变量(例如数据位置、dev/prod数据库的凭据)、处理一些命令行参数,以及设置对项目中的大多数脚本有用的其他变量(当前的日期为YYYYMMDD格式,股票市场目前是否开放等)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2474588

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档