短答案:OP的提示 `
> cpan IPC::Run
` 表明这是一个标准的 macOS 用户级别 Perl 模块安装。如果在运行环境中,
由 cpan
首次运行追加到 .zshrc
(或等效文件)的标准环境变量不存在,将会出现所述错误。
macOS 用户级别的
cpan IPC::Run
命令可以正常工作,只要满足以下条件:
- 打开一个新的终端窗口,以便预期的 Perl 环境变量存在
- 或者将缺失的环境变量行添加到终端资源文件中
.zshrc 添加的行
PATH="/Users/USERNAME/perl5/bin${PATH:+:${PATH}}"; export PATH;
PERL5LIB="/Users/USERNAME/perl5/lib/perl5${PERL5LIB:+:${PERL5LIB}}"; export PERL5LIB;
PERL_LOCAL_LIB_ROOT="/Users/USERNAME/perl5${PERL_LOCAL_LIB_ROOT:+:${PERL_LOCAL_LIB_ROOT}}"; export PERL_LOCAL_LIB_ROOT;
PERL_MB_OPT="--install_base \"/Users/USERNAME/perl5\""; export PERL_MB_OPT;
PERL_MM_OPT="INSTALL_BASE=/Users/USERNAME/perl5"; export PERL_MM_OPT;
检查活动环境
echo $PATH
set | grep ^PERL
TL;DR
以下是针对以下问题改写的发现:《如何在苹果的 macOS Perl 中安装和使用 CPAN 模块?》
注意:下面的详细信息是通过重新创建和评估原始问题的错误以及寻求理解我在 Ventura 上使用的 macOS Perl 的 cpan
安装模块时遇到的一些问题而找到并记录的。
苹果的 Pearl 定制
苹果的 Perl(从早期的 Mac OS X 至少到 macOS Ventura 13.4)有定制功能。关于这些定制的信息可以在 perlmacosx
手册页中找到:
![](https://istack.dev59.com/JosCz.webp)
Apple的Perl自定义包括:
AppendToPath
和PrependToPath
以将路径添加到模块搜索路径(@INC
)
ARCHFLAGS
用于构建多个指令集架构
安装位置
cpan
的第一次运行将确定CPAN模块安装的基本路径。
cpan IPC::Run
根据提示的选择,生成基本安装路径如下:
[local::lib]
- Users/USERNAME/Perl5
… 默认和操作者的使用情况。
sudo
- /Library/Perl
manual
- /some/user/chosen/path
模块使用
在干净的 macOS Ventura Perl 安装上进行初始的 cpan
运行,包括以下提示问题:"…将其附加到…"
请注意,接受提示的
[yes]
并不提供关于追加了什么内容或原因的额外信息。很容易忽视这一点。然而,请看看追加了什么内容...。
.zshrc 追加的行
PATH="/Users/USERNAME/perl5/bin${PATH:+:${PATH}}"; export PATH;
PERL5LIB="/Users/USERNAME/perl5/lib/perl5${PERL5LIB:+:${PERL5LIB}}"; export PERL5LIB;
PERL_LOCAL_LIB_ROOT="/Users/USERNAME/perl5${PERL_LOCAL_LIB_ROOT:+:${PERL_LOCAL_LIB_ROOT}}"; export PERL_LOCAL_LIB_ROOT;
PERL_MB_OPT="--install_base \"/Users/USERNAME/perl5\""; export PERL_MB_OPT;
PERL_MM_OPT="INSTALL_BASE=/Users/USERNAME/perl5"; export PERL_MM_OPT;
如果在同一个终端窗口中运行
bosswrap.pl(没有更新
.zshrc
),那么会重新创建OP的错误。
./bosswrap.pl
然而,如果打开一个新的终端窗口,将应用
.zshrc
的更新,那么
bosswrap.pl
就可以无错误地运行。
./bosswrap.pl
看起来,通过在运行环境中使用提供的PATH
、PERL5LIB
、PERL_LOCAL_LIB_ROOT
、PERL_MB_OPT
和PERL_MM_OPT
,可以解决OP特定的错误场景。可能只需打开一个新的终端窗口以使附加的值生效。或者,如果最初的cpan
“...添加到...`步骤被拒绝|忽略”,可以手动将变量添加到shell资源文件中。
一般来说,如果选择在非标准位置安装Perl模块,Apple提供了全局机制,可以使用AppendToPath
和PrependToPath
来添加@INC
搜索路径。
![](https://istack.dev59.com/STV10.webp)
所以,对于macOS(例如Ventura),有两种方法可以将目录添加到运行时包含路径
(@INC)
中,而不会干扰Perl脚本文件。
- 环境变量:
PERL5LIB
- 注意需要正确设置
PATH
、PERL_LOCAL_LIB_ROOT
、PERL_MB_OPT
、PERL_MM_OPT
。
- "/Library/Perl"系统范围内的第三方模块
AppendToPath
|PrependToPath
然而,如果希望在单个脚本基础上添加@INC
搜索路径,则可以将use lib qw(/some/other/path);
语句添加到Perl脚本本身。
运行时架构
一般来说,相对于 macOS 可能需要的用于带有启用了 rosetta 的
x86_64
的本机
arm64
机器的二进制文件,CPAN 安装是天真的。这实际上是一台多架构机器。只安装一种 ISA 架构可能会导致运行时冲突,当一个 Perl 应用程序使用 x86_64,而另一个 Perl 应用程序使用 arm64(arm64e)作为两者共同使用的 Perl 二进制模块时。
一些 Perl CPAN 模块将安装二进制的
*.bundle
可执行文件。例如,
Financle::Quote
模块安装后会有 5 个
*.bundle
文件。
MY_PERL_INSTALL="/Users/USERNAME/Perl5"
find "$MY_PERL_INSTALL" -name "*.bundle"
在Perl模块安装树中添加file
命令,以确定是否存在不一致的二进制ISA切片集:
MY_PERL_INSTALL="/Users/USERNAME/Perl5"
find "$MY_PERL_INSTALL" -name "*.bundle" | xargs file
Apple的Perl自定义提供了环境变量ARCHFLAGS
,以便让Perl安装通用二进制模块。
![enter image description here](https://istack.dev59.com/13Qmz.webp)
ARCHFLAGS
可以在使用cpan
时按如下方式使用:
env ARCHFLAGS='-arch arm64 -arch arm64e -arch x86_64' cpan Test2
env ARCHFLAGS='-arch arm64 -arch arm64e -arch x86_64' cpan Finance::Quote
请注意:如果已经安装了非通用二进制文件,需要先卸载该安装,因为标准的 Perl 安装/更新只会检查版本号,而不会检查任何底层 ISA 二进制切片。
有关通用二进制 Perl 模块的更详细问题和答案,请参阅
如何安装和更新“通用”(x86_64、arm64)Perl 模块?。
set | grep ^PERL; echo 'o conf' | cpan
的输出是什么? - ikegami/Users/BNW/perl5/lib
添加到环境变量PERL5LIB
中。 - ikegami