我该如何找到Perl的标准site_perl目录?

6
我该如何找到标准的site_perl(非特定架构)位置?直接循环@INC并找到以"site_perl"结尾的路径是否安全,还是有一种标准方法可以做到这一点?
我之所以想要找到这个位置,是因为我有一个非常大的项目,由数百个单独的模块构建而成,每个模块都有自己的Makefile.PL文件(几乎每个.pm文件都被构建为其自己的CPAN风格模块)。除此之外,每个模块可能有各种位置的工件(模板、.cgi等),所有这些都需要部署到各种位置,没有什么是标准化的。这是试图控制它的第一步,基本上有一个可以找到和部署所有内容的单个Makefile,下一步将是在版本控制中以合理的布局进行。
我花了时间尝试使用标准安装工具来做到这一点,但没有成功。

1
你为什么要寻找site_perl?如果你告诉我们你想要做什么,我们很可能就能告诉你该怎么做。 :) - brian d foy
4个回答

8
C:\Temp> perl -MConfig -e "print qq{$_ => $Config{$_}\n} for grep { /site/ } keys %Config"

  d_sitearch => define
  installsitearch => C:\opt\perl\site\lib
  installsitebin => C:\opt\perl\site\bin
  installsitehtml1dir =>
  installsitehtml3dir =>
  installsitelib => C:\opt\perl\site\lib
  installsiteman1dir =>
  installsiteman3dir =>
  installsitescript => C:\opt\perl\site\bin
  sitearch => C:\opt\perl\site\lib
  sitearchexp => C:\opt\perl\site\lib
  sitebin => C:\opt\perl\site\bin
  sitebinexp => C:\opt\perl\site\bin
  sitehtml1dir =>
  sitehtml1direxp =>
  sitehtml3dir =>
  sitehtml3direxp =>
  sitelib => C:\opt\perl\site\lib
  sitelib_stem =>
  sitelibexp => C:\opt\perl\site\lib
  siteman1dir =>
  siteman1direxp =>
  siteman3dir =>
  siteman3direxp =>
  siteprefix => C:\opt\perl\site
  siteprefixexp => C:\opt\perl\site
  sitescript =>
  sitescriptexp =>
  usesitecustomize => define

或者,正如@ysth在评论中指出的那样,你可以使用:

C:\Temp> perl -V:.*site.*

在Windows上

 $ perl '-V:.*site.*'

在*nix shell中。

5

是否有不使用模块安装程序(ExtUtils::MakeMakerModule::BuildModule::Install)的原因?

但如果你必须这样做,该目录可在加载Config后使用,格式为$Config::Config{'installsitelib'}。请注意,某些平台可能会配置perl,使得该目录并未直接出现在@INC中,而是将某个其他目录符号链接到installsitelib目录。


2

只需运行 perl -V。它将在结尾处打印默认的 @INC。


1

循环遍历@INC是不安全的,因为它可能会被代码或环境修改,因此可能包含多个以site_perl结尾的目录。

如果您想确定给定模块的安装位置,请使用%INC


不,我正在尝试找到安装特定模块的位置。我对安装目标有很高的控制权,但在这个阶段无法更改@INC,也由于复杂性无法使用MakeMaker等工具。 - Matthew Watson
perl -V | grep sitelib 查找 -Dsitelib= 值 - Chas. Owens
@Chas. Owens:安装sitelib,而不是installsitelib。 - ysth

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