【问题标题】:Adding a path to @INC but not within the Perl script添加@INC 的路径,但不在 Perl 脚本中
【发布时间】:2019-04-23 08:19:17
【问题描述】:

我拥有一个用 Perl 和 Java 编写的工具。其中一个脚本使用JSONData::Dumper 等模块。 我的环境和我的@INC 知道这些模块的位置。但是使用我的工具的用户有一个错误:

Can't locate JSON.pm in @INC (@INC contains: <PATHS> .) at /tools/bin/myscript.pl line 15.

我了解@INC 的工作原理,我只是想知道解决此问题的正确方法是什么。我们在同一家公司(不同地区)工作,因此用户确实有权访问包含这些模块的区域。 从我的角度来看,这些脚本运行良好,因为我的@INC 确实包含一个路径,其中包含这些模块。

从之前的帖子中,我了解到我可以将PERL5LIB 设置为包含(非递归)包的区域。但是这个问题感觉还不够好,因为我必须指定多路径(因为 JSON 和 Data::Dumper 不在同一个区域,PERL5LIB 检查目录中的模块但不是递归的)。

另外,从以前的线程中我了解到我可以运行perl -I myscript.pl,但这并没有帮助,因为我的工具主要是执行 Perl 的 Java。此外,我不喜欢在脚本本身进行任何更改,而是在用户的环境中进行更改。

解决这类问题的方法是什么?有没有办法从Linux“推送”到@INC 的路径?今后如何防止此类问题的发生?

【问题讨论】:

  • 为什么不直接安装代码所依赖的 CPAN 模块?
  • @robert 它们安装在不同的区域。

标签: perl


【解决方案1】:

根据我收集到的您的描述,PERL5LIB 似乎是一个不错的解决方案。

我不知道你所说的“PERL5LIB 检查目录中的模块但不递归”是什么意思,但是PERL5LIB 是一个 shell 变量,通常在你的 shell 配置文件中设置(虽然这也可以动态完成),到目录的list。来自Environment (perlrun)PERL5LIB

在查看标准库和当前目录之前要在其中查找 Perl 库文件的目录列表。 [...]

因此,您可以将其设置为涵盖所有需要的合适目录列表。

确保它是一个环境变量,使用export in [ba]sh

export PERL5LIB="/path/to/dir1:/other/path/dir2:$HOME/inhome/dir3"

如果目录名称中有空格,则引号所在的位置。此行通常输入文件~/.bashrc

或者,如果在[t]csh 中,则使用setenv,并在~/.tcshrc 中添加以下行

setenv PERL5LIB "/path/to/dir1:/other/path/dir2:$HOME/inhome/dir3" 

【讨论】:

  • 我的意思是,如果我有以下结构:/tools/main/dir1/JSON.pm/tools/main/dir2/Data.pm 我不能使用setenv PERL5LIB /tools/main,因为它无法找到这些模块。我必须设置确切的路径(例如第一个模块的/tools/main/dir1/)。我认为这是 Perl 版本的问题。我使用5.14.1,用户使用5.7.1。为了从 Linux 角度设置正确的版本,需要更改哪些配置?
  • 5.7.1?你确定吗。从 2001 年 4 月起,该版本已 18 岁......
  • 5.7.1 甚至不是生产版本;这是一个开发版本,旨在让开发人员在即将发布的 5.8 生产版本实际发布之前发现它的问题。
  • 对不起,我的意思是5.8.7。不知道为什么我说5.7.1
  • @vesii 不,你是对的。 @INC 中的路径必须是安装模块的根目录,它们不是递归的 - 这对于存储在子目录中的具有多个名称组件的模块很重要。因此,在您的情况下,您必须同时添加 /tools/main/dir1/tools/main/dir2
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-15
相关资源
最近更新 更多