【问题标题】:Having issues with Perl dependencies遇到 Perl 依赖问题
【发布时间】:2012-07-31 11:50:26
【问题描述】:

我接手了一个用 Perl 编写的项目,它有一些依赖项,例如 Template::ToolkitImage::ExifToolGD 等等。目前,这些依赖项使用make 中的--prefix 选项构建到一个目录(“deps”文件夹)中。在主 Perl 脚本中,我有类似以下的内容来导入必要的模块:

use File::Spec::Functions qw(catdir);
use lib "lib";
use lib catdir(qw(deps lib perl5 site_perl));

catdir 用于偏离某些系统要求(例如假设“/”是文件夹分隔符;如果有人有其他选择,我愿意接受建议!)。 “lib”文件夹包含我的模块,“deps/lib/perl5/site_perl”文件夹是我的依赖项安装在我原来的机器上的位置。

但是,在另一台机器上构建依赖项后,所需的库似乎已移动到不同的文件夹中。我现在需要使用这些语句来让我的脚本正确运行:

use File::Spec::Functions qw(catdir);
use lib "lib";
use lib catdir(qw(deps lib perl 5.14.2));
use lib catdir(qw(deps share perl 5.14.2));

我想知道是否有指定前缀目录(“deps”)并让use lib pragma 递归搜索该目录以查找我的依赖项。此外,此脚本的用户无法访问 Internet,因此将我的项目编译为 CPAN 模块会适得其反。

感谢大家的帮助!

【问题讨论】:

  • Perl 支持的所有系统都使用“/”。 require Foo::Bar; 字面意思是 require 'Foo/Bar.pm';
  • 谢谢!经过进一步研究,我看到 Perl 自己处理文件分隔符。但是,perlmonks.org/?displaytype=print;node_id=110030;replies=1 告诉我 MacOS 9 的情况并非如此。尽管该线程似乎已经过时了...
  • 不,Perl 根本不处理文件分隔符。那个帖子是错的。 Windows 原生完全支持“/”。
  • 我认为 INSTALL_BASE 是我想要的 (perldoc.perl.org/ExtUtils/MakeMaker.html#INSTALL_BASE)。我应该能够使用 INSTALL_BASE/lib/perl5/$Config{archname} 获得正确的目录,对吧?

标签: perl makefile


【解决方案1】:

安装模块时使用INSTALL_BASE for the Makefile.PL--install_base for Build.PL。他们提供stable install locations。 PREFIX 和 --prefix 试图模拟 perl 如何布局其系统库,并且对于制作包更有用。

您还需要在路径上运行rel2abs,然后再将其提供给 lib 以提供绝对路径。这将保护您,以防您的代码 chdirs 然后尝试 require 一个模块。或者你可以使用lib::abs

而且 ikegami 是正确的,没有必要使传递给 lib 的文件路径可移植。只需以 Unix 风格传递它们。 Perl 会弄清楚的。

【讨论】:

  • 导入依赖项时是否需要同时使用 INSTALLARCHLIB 和 INSTALLPRIVLIB?如:use Config; use lib "deps/lib/perl5"; use lib "deps/lib/perl5/$Config{archname}";
  • 不,Perl 应该为你找到 archlib。
猜你喜欢
  • 1970-01-01
  • 2010-12-10
  • 2017-11-08
  • 2011-07-26
  • 2014-10-20
  • 1970-01-01
  • 1970-01-01
  • 2015-02-16
  • 1970-01-01
相关资源
最近更新 更多