在[Windows子系统Linux]中安装Perl模块

5
我想在Windows 10(WSL)的Linux环境下使用Perl脚本。我已经启用了WSL,安装了编译器(gccmake),并执行了sudo apt-get install build-essential。Perl可以工作,并且我可以运行简单的脚本。当我尝试安装Perl模块时,问题就开始了。例如,我试图通过运行perl -MCPAN -e'install "LWP"'来添加LWP。它会给出很多错误/警告消息,以Warning: the following files are missing in your kit:开头。完整输出太大了,无法在此处粘贴,因此我必须将其放在其他地方:http://pastebin.com/RRRedwbG。简而言之,无论包是什么,所有.pm和.t文件都被认为是缺失的。

2
可能是这个问题:https://github.com/Microsoft/BashOnWindows/issues/186 - melpomene
是的!我也刚找到它。 - Vasily A
1
顺便说一下,你可以直接执行 cpan LWP。不需要折腾 perl -MCPAN -e ... - melpomene
@melpomene,你愿意写一个答案吗? - ikegami
1
@ikegami 我觉得我不够能力去做那件事。我从来没有使用过WSL,而且根据链接显示该错误已经关闭,所以我不确定该推荐什么。 - melpomene
显示剩余4条评论
2个回答

7
在Unix文件系统中,一个目录的.是指向自身的硬链接,而一个目录的..是指向其父目录的硬链接。因此,当您对一个目录进行stat操作时,stat返回的链接计数将至少为1(名称)+ 1(.)+ $num_sub_dirs(..)
$ ls -ld .
drwx------ 5 ikegami ikegami 46 Dec 16 12:03 .    # 5 = Could have up to three subdirs

$ ls -l .
total 0
drwx------ 2 ikegami ikegami 10 Dec 16 12:03 a    # 2 = No subdirs
drwx------ 3 ikegami ikegami 24 Dec 16 12:03 b    # 3 = Could have up to one subdir
drwx------ 2 ikegami ikegami 10 Dec 16 12:03 c    # 2 = No subdirs

File::Find依赖于此信息,在可能的情况下对自身进行优化。

Perl和File::Find知道FAT和NTFS文件系统并非如此,因此在Windows上禁用了优化。然而,它们认为VSL看起来像一个Linux系统,因此错误地假设它们正在处理一个Unix文件系统。

最好的解决方法是编辑以下命令输出的文件:

perl -MConfig -e'CORE::say $INC{"Config.pm"}'

更改

dont_use_nlink => undef

to

dont_use_nlink => 1

您可以使用以下方式验证更改:
$ perl -V:dont_use_nlink
dont_use_nlink='1';

这个答案基于这个bug报告



6
解决方案在 github.com/Microsoft/BashOnWindows/issues/186 找到:
1. 运行 sudo apt-get install liblocal-lib-perl cpanminus build-essential
2. 编辑 /usr/lib/perl/5.18.2/Config.pm 文件(大约在第94行)将 dont_use_nlink => 1
3. 运行 eval "$(perl -I$HOME/perl5/lib/perl5 -Mlocal::lib)"

2
第三个命令是用于使用local::lib,与手头的问题无关。 - ikegami
1
第一条命令安装了 local::libcpanm 和一些构建工具(make、gcc 等)。它们并不直接相关。 - melpomene
嗯,仅仅编辑 Config.pm 对我来说没有用,只有在运行了这三个命令之后我才成功了。 - Vasily A
@VasilyA 在编辑 Config.pm 后你遇到了什么错误? - melpomene
你可能因为其他原因需要/想要它们。 - ikegami
刚才我尝试执行第一个命令失败了 - E: 无法定位软件包...liblocal-lib-perl...cpanminus,针对 Ubuntu 18.04.1 LTS(根据 sudo lsb_release -a 命令)。 - Kenny Evitt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接