如何在没有 root 权限的情况下安装 Perl 模块?
Posted
技术标签:
【中文标题】如何在没有 root 权限的情况下安装 Perl 模块?【英文标题】:How can I install Perl modules without root privileges? 【发布时间】:2011-04-13 17:52:51 【问题描述】:我在一台没有 root 权限的 Linux 机器上。我想通过 CPAN 将一些包安装到我的主目录中,这样当我运行 Perl 时,它就能看到它。
我运行了cpan
,它要求提供一些配置选项。它要求一些目录,它建议~/perl
“非root用户”。尽管如此,当我尝试安装一个包时,它在make install
步骤失败,因为我没有对/usr/lib/perl5/whatever
的写入权限。
如何配置 CPAN 以便将软件包安装到我的主目录中?
【问题讨论】:
How can I use CPAN as a non-root user? 的可能重复项 @Ether。我同意。我还推荐 perlbrew,它在问题“如何使用 perlbrew 在我的家下安装 Perl 版本?”中提到。 ***.com/questions/3733482/… How can I use a new Perl module without install permissions?的可能重复 【参考方案1】:见local::lib。
安装完成后,您可以:
perl -MCPAN -Mlocal::lib -e 'CPAN::install(LWP)'
【讨论】:
不工作:mkdir /root/.cpan: Permission denied at /usr/lib/perl5/5.8.5/CPAN.pm line 2342
。有什么方法可以测试 local::lib 是否已正确安装?
Support for local::lib
was added to CPAN.pm
in 2011。 perl
5.8.5 是 released in 2004。这就是问题所在。【参考方案2】:
perlfaq8 中记录了这种方式,这就是 local::lib 正在为您做的事情。
这也是 *** 的一个常见问题:
Why does installing certain CPAN modules require root privilege? How can I install CPAN modules locally without root access (DynaLoader.pm line 229 error)? How do I tell CPAN.pm to install all modules in a specific directory? How can I install a CPAN module into a local directory? How can I use a new Perl module without install permissions? How can I use CPAN as a non-root user? How can I install local modules with the cpan tool?奇怪的是,当我使用您的原始问题标题时,这些都没有被建议(这是一个好的标题对于找到您的答案非常重要的原因之一)。
如何保留我自己的模块/库目录?
当你构建模块时,告诉 Perl 将模块安装在哪里。
如果您想安装模块供自己使用,最简单的方法可能是 local::lib,您可以从 CPAN 下载。它为您设置各种安装设置,并在您的程序中使用这些相同的设置。
如果您想要更大的灵活性,您需要针对您的特定情况配置您的 CPAN 客户端。
对于基于 Makefile.PL 的发行版,在生成 Makefile 时使用 INSTALL_BASE 选项:
perl Makefile.PL INSTALL_BASE=/mydir/perl
您可以在您的 CPAN.pm 配置中进行设置,以便在您使用 CPAN.pm shell 时模块自动安装在您的私有库目录中:
% cpan
cpan> o conf makepl_arg INSTALL_BASE=/mydir/perl
cpan> o conf commit
对于基于 Build.PL 的发行版,使用 --install_base 选项:
perl Build.PL --install_base /mydir/perl
您也可以将 CPAN.pm 配置为自动使用此选项:
% cpan
cpan> o conf mbuild_arg "--install_base /mydir/perl"
cpan> o conf commit
INSTALL_BASE 告诉这些工具将您的模块放入 /mydir/perl/lib/perl5。请参阅如何在运行时将目录添加到我的包含路径 (@INC)?有关如何运行新安装的模块的详细信息。
但是,INSTALL_BASE 有一个警告,因为它与旧版本的 ExtUtils::MakeMaker 提倡的 PREFIX 和 LIB 设置不同。 INSTALL_BASE 不支持在同一目录下安装多个版本的 Perl 或不同体系结构的模块。您应该考虑是否真的需要,如果需要,请使用旧的 PREFIX 和 LIB 设置。有关详细信息,请参阅 ExtUtils::Makemaker 文档。
【讨论】:
【参考方案3】:CPAN方式
运行cpan
命令。如果您没有配置 CPAN,请先配置!否则,您将看到 cpan 提示。在这种情况下,键入look local::lib
,您将看到一个新的 shell 提示符。在这个新的 shell 中,运行 bootstrap 命令配置和编译模块,如下所示。
user@host:~/.cpan/build/local-lib-1.004003-UyX2wf$ perl Makefile.PL --bootstrap && make test && make install
现在,导出一些变量:
local::lib 安装的路径
echo 'eval $(perl -I$index.t/perl5/lib/perl5 -Mlocal::lib)' >> ~/.bashrc
和 Perl 变量避免用户输入
echo 'export PERL_MM_USE_DEFAULT=1' >> ~/.bashrc
现在加载你的 bashrc 运行
source ~/.bashrc
尝试安装运行cpan <SOME_VALID_MODULE_NAMESPACE>
就是这样!现在您可以在没有 root 权限的情况下使用 cpan 安装模块。但是,请记住,这仅适用于 CURRENT USER,包括 root 用户!
cpanminus 方式
如果你安装了这个,你的系统管理员值得喝一杯!
快跑
$ cpanm --local-lib=~/perl5 local::lib && eval $(perl -I ~/perl5/lib/perl5/ -Mlocal::lib)
打开另一个终端并运行
$ env |grep PERL
您应该会看到如下内容:
PERL5LIB=$HOME/perl5/lib/perl5 PERL_MB_OPT=--install_base "$HOME/perl5"
PERL_LOCAL_LIB_ROOT=$HOME/perl5
PERL_MM_OPT=INSTALL_BASE=$HOME/perl5
但如果不是,请像这样导出变量:
$ echo "export PERL5LIB=\"$HOME/perl5/lib/perl5\"">>~/.bashrc && \
echo "export PERL_MB_OPT=\"--install_base '$HOME/perl5'\">>~/.bashrc && \
echo "export PERL_LOCAL_LIB_ROOT=$HOME/perl5">>~/.bashrc
最后,加载你的 bashrc 文件并尝试使用命令安装
source ~/.bashrc
和
cpanm <SOME_VALID_MODULE_NAMESPACE>
Fim!
【讨论】:
只是评论说“cpanminus 方式”似乎在您没有 root 访问权限的基于 Debian 或 Ubuntu 的系统上运行良好。假设安装了 Debian 软件包cpanminus
,您可以指定一个自定义安装目录,如上所述,然后安装甚至像 cpanm Tk
这样的复杂软件包,以及 Just Works™(假设您安装了 C 编译器等)你的路径。)以上是关于如何在没有 root 权限的情况下安装 Perl 模块?的主要内容,如果未能解决你的问题,请参考以下文章
如何在没有 root 访问权限的情况下获取已安装应用程序的 APK?
如何在没有 root 访问权限的情况下安装 python 模块?
如何在没有 root 权限的情况下在图像文件上安装 grub?