2

我希望能够使用保存在我的源代码存储库的 lib 目录中的模块,并且我希望开发人员使用我正在编写的脚本的唯一先决条件是安装标准的Perl,但我不知道如何做到这一点。

在我的脚本中,我有

use FindBin qw($Bin);
use lib "$Bin/lib"; # store non standard modules here
use Term::ANSIColor;
use Win32::Console::ANSI;
print Term::ANSIColor::colored("this should be in color\n", "bold red");

我把模块放在./lib 中。我验证了这是模块存在的实际位置(通过重命名它并导致它失败)。但是,即使该模块位于任意 lib 目录中,似乎仍然需要ppm了解该模块。

如果没有首先由ppm “安装”,我无法让我的脚本在 lib 中找到/使用它。我想应该有某种解决方法。

我知道这可能是一个非典型的要求,但我的目标可能是非典型的。我只希望开发人员进行结帐并立即使用一些脚本,而无需运行一些额外的命令或使用包管理器。

感谢您的任何见解。

编辑:我更新了一个完整的例子。我还意识到,如果我通过 ppm 卸载它(但将 pm 保留在引用的目录中),我可能必须更改我的语法,而我之前没有考虑过。所以也许我必须给出一个完整的路径或使用像 jheddings 或 BipedalShark 提议的要求(即,如果它没有“安装”,那么我必须使用“要求”并将“.pm”附加到它或使用 BEGIN 块。

如果是这种情况,那么我还没有找到正确的语法。

编辑 2:根据下面的评论,我意识到我可能有一个有缺陷的假设。我的理由是:如果我直接引用实际代码“.pm”,那么我应该能够在不使用包管理器的情况下使用它。也许情况并非如此,或者如果我想这样做,也许我必须以不同的方式来做。或者,我可能不得不重构“.pm”中的代码。

编辑3:我认为我误解了一些事情。我的 IDE 中的错误消息“Compilation failed in require”,突出显示了我用来包含模块的行,以及控制台错误消息“Can't locate loadable object for module Win32::Console::ANSI”

我将其视为加载模块本身的问题,但这似乎是由模块本身尝试加载的某些东西引起的问题。有趣的是,这只是一个问题,因为我没有使用 ppm install 。

它正在寻找实际的模块。我能够通过注释掉故障行来验证这一点。

感谢您的帮助,但我将不得不花更多时间来处理它。

4

5 回答 5

3

请参阅“Can't locate loadable object for module ...”下的perldoc perldiag :

    (F) The module you loaded is trying to load an external library,
    like for example, "foo.so" or "bar.dll", but the DynaLoader module
    was unable to locate this library.  See DynaLoader.

你是对的,这个问题是由模块试图加载的东西引起的——这就是Dynaloader所做的。但是,Win32::Console::ANSI的文档没有提及任何外部库要求。

于 2009-11-15T07:08:44.917 回答
2

您是否在lib目录中保留了模块路径结构?
即你的模块应该在路径中$Bin/lib/Some/Module.pm

于 2009-11-15T00:51:30.613 回答
2

perlfaq8如何将我的程序所在的目录添加到模块/库搜索路径的回答中?

您似乎做得对,但如果您希望获得帮助,您需要给我们更多信息。

当您运行该脚本时,结果是什么@INC?放入调试行,如:

 BEGIN {
      use lib ...;
      print "INC is \@INC\n"; 
      }

检查该输出是否显示您期望的目录。如果没有,请从那里开始平分问题。

于 2009-11-15T03:44:47.357 回答
1

尝试这个:

BEGIN {
    use FindBin qw($Bin);
}
use lib "$Bin/lib"; # store non standard modules here
于 2010-09-20T23:14:04.593 回答
0

我一直手动安装模块,它似乎工作。我只是将目录和文件复制到一个位置,然后像你展示的那样使用“use lib”指令。有时我错过了一个文件,我得到一个运行时错误,它正在寻找某个文件,我去 Internet 上找到该文件并将它放在正确的位置并且它可以工作。不确定您的设置发生了什么。这应该有效。

我通常将 perl 模块与我的脚本放在同一目录中,然后:使用 lib "." 但我不知道这会很重要。

于 2009-11-15T02:17:14.140 回答