Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl 如果没有人工干预,CPAN/cpanm本地安装的CPAN模块无法使用_Perl_Cpan_Locallib_Cpanm - Fatal编程技术网

Perl 如果没有人工干预,CPAN/cpanm本地安装的CPAN模块无法使用

Perl 如果没有人工干预,CPAN/cpanm本地安装的CPAN模块无法使用,perl,cpan,locallib,cpanm,Perl,Cpan,Locallib,Cpanm,我已将我的应用程序打包为Perl模块,无法使用cpan或cpanm命令进行安装。问题是,这些命令(如果不是以root用户身份运行)将必备模块安装到~/perl5目录中。但是,@INC中不包括我的~/perl5目录 这导致cpanm产生以下令人困惑的输出: $ cpanm --installdeps . --> Working on . Configuring my-module-0.001 ... OK ==> Found dependencies: Image::Size --&g

我已将我的应用程序打包为Perl模块,无法使用
cpan
cpanm
命令进行安装。问题是,这些命令(如果不是以root用户身份运行)将必备模块安装到~/perl5目录中。但是,@INC中不包括我的~/perl5目录

这导致cpanm产生以下令人困惑的输出:

$ cpanm --installdeps .
--> Working on .
Configuring my-module-0.001 ... OK
==> Found dependencies: Image::Size
--> Working on Image::Size
Fetching http://www.cpan.org/authors/id/R/RJ/RJRAY/Image-Size-3.232.tar.gz ... OK
Configuring Image-Size-3.232 ... OK
Building and testing Image-Size-3.232 ... OK
Successfully installed Image-Size-3.232
! Installing the dependencies failed: Module 'Image::Size' is not installed
! Bailing out the installation for my-module-0.001.
1 distribution installed
如您所见,它成功地下载、测试和安装了Image::Size模块,但随后尝试使用它,但失败了


我知道我可以通过将环境变量$PERL5LIB设置为“~/perl5/lib/perl5”并将“~/perl5/bin”添加到我的$PATH来解决这个问题,但我真的很想知道这种情况是如何产生的。我希望为我的应用程序用户提供尽可能简单的安装说明,手动修改环境变量并不是我计划指导他们的事情。

以下是我自己的解决方案。我切换到,并为我的用户提供了以下安装说明:

安装说明
=========================
要安装此程序,您需要Dist::Zilla,可以安装它
通过以root用户身份运行以下命令:
cpan区:齐拉
之后,确保您位于安装文件所在的目录中,
并以root用户身份运行以下命令:
dzil安装

如果您使用的是bash,您可以安装local::lib并将类似的内容添加到.bashrc文件中

# adds $HOME/perl5/bin to PATH
[ $SHLVL -eq 1 ] && eval "$(perl -I$HOME/perl5/lib/perl5 -Mlocal::lib)"

那应该能解决你的问题。问题是本地系统的配置方式,因此请调整它,而不是将Dist::Zilla引入不需要的混合中。

如果您没有root权限,则无法安装到系统目录中。故事结束了。告诉他们使用
su
,或者干脆什么都不告诉他们;因为这是正常的行为,所以他们不会期望有任何不同。@goldilocks cpan和cpanm安装到~/perl5不是很意外吗?如果您不是root用户,则不会。对于普通用户来说,系统目录是只读的,这一点大家都知道。他们不会期望神奇地将自己的模块添加到
/usr/lib/perl5
,因为唯一能实现这一点的魔法是将目录世界设置为可写,这显然是一个非常糟糕的主意。当我在一个没有root权限的系统上工作时,我需要安装自己的模块,我知道我必须使用我的主目录。这是完全正常的。没错,非root用户不能写入/usr/lib/完全有道理。然而,非常奇怪的是,一旦模块安装到~/perl5,它们就不能使用了!我不知道为什么默认情况下
@INC
不包括该目录——可能是因为这样会出现一个问题,即它是应该先发制人(列在前面)还是应该先发制人(列在最后),而且添加到
@INC
比从中删除要容易一些。不过,这也是规范,例如,
$PATH
$LIBRARY\u PATH
等,因此此约定可能遵循此约定。我不推荐此解决方案。Zilla是一个具有巨大依赖链的分发构建工具,并不打算用作安装程序。如果您希望您的用户能够在本地安装,我建议使用
local::lib
cpanm-L~perl5
)或
perlbrew
@friedo进行
cpanm
安装,但我尝试过使用cpanm或perlbrew,但无法做出简洁的安装说明。有经验的用户将知道该做什么,而初学者只需键入这两个命令即可。我仍然很想学习更简单的安装说明。如果我看到这些说明,我将知道该怎么做,但我不确定我是否愿意这样做,特别是如果这是我想在生产中使用的模块。谢谢回答。我最初的问题主要是一个咆哮,说默认情况下这不会被追加。但是我喜欢Dist::Zilla,它让我专注于打包模块以外的其他事情;-)我听到你在说什么,但我认为如果它是默认附加的,那可能会让很多人感到惊讶。:)我还喜欢Dist::Zilla,并将其用于我的大多数CPAN模块。如果它是一个CPAN模块,我使用Dist::Zilla和“dzil release”,这样最终用户就不需要知道创建发行版使用了什么。最终用户(即不是开发人员)不应该仅仅为了安装成品而需要Dist::Zilla。它引入了许多其他依赖项。如果使用Dist::Zilla插件,情况会变得更糟。:)它们是令人惊叹的开发工具,但它们不是安装所必需的。如果它不是CPAN模块呢?也就是说,它是一个非库最终用户应用程序?另一个选择是使用或之类的东西将代码打包并发送到私有存储库。然后,最终用户可以以与部署公共CPAN模块完全相同的方式部署您的专有代码。免责声明:我对Pinto和Stratopan负责。