为什么即使用FindBin调整@INC后,我的Perl脚本也找不到我的模块?

时间:2009-11-15 00:44:10

标签: perl module activeperl

我希望能够使用保存在源代码库的lib目录中的模块,并且我希望开发人员使用我正在编写的脚本的唯一先决条件是拥有标准< / em> 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 了解该模块。

我无法让我的脚本在lib中查找/使用它,而不是先由 ppm “安装”。我想应该有一些解决方法。

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

感谢您的任何见解。

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

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

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

编辑3:我认为我误解了一些事情。我的IDE“Compilation failed in require”中的错误消息,突出显示我用于包含模块的行,以及“无法找到模块Win32 :: Console :: ANSI的可加载对象”的控制台错误消息

我正在阅读这是加载模块本身的一个问题,但它似乎是由模块本身试图加载的东西引起的问题。有趣的是,这只是一个问题,因为我没有使用ppm安装。

找到实际的模块。我能够通过评论故障线来验证这一点。

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

5 个答案:

答案 0 :(得分:3)

请参阅“无法找到模块的可加载对象...”下的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的文档未提及任何外部库要求。

答案 1 :(得分:2)

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

答案 2 :(得分:2)

perlfaq8回答How do I add the directory my program lives in to the module/library search path?

您似乎正确地执行了此操作,但如果您希望获得帮助,则需要向我们提供更多信息。

当您运行该脚本时,最终会出现在@INC中?放入调试行,如:

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

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

答案 3 :(得分:1)

试试这个:

BEGIN {
    use FindBin qw($Bin);
}
use lib "$Bin/lib"; # store non standard modules here

答案 4 :(得分:0)

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

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