如何在OSX上覆盖httpd.conf中的@INC设置

Ric*_*uck 2 apache perl configuration cgi

如何设置Perl在OSX上的Apache httpd.conf文件中查找模块的位置?

我通过CPAN安装了几个模块,这些模块已成功安装

/opt/local/lib/perl5/site_perl/5.8.9
Run Code Online (Sandbox Code Playgroud)

我可以通过验证 perldoc perllocal

如果我perl -V在命令行上运行,我得到(以及其他目录):

@INC:
  /opt/local/lib/perl5/site_perl/5.8.9/darwin-2level
  /opt/local/lib/perl5/site_perl/5.8.9
Run Code Online (Sandbox Code Playgroud)

但是,当我通过Apache运行perl脚本作为CGI时,我得到的错误是我use找不到的模块.@INC中包含的目录列表与我的本地perl配置不匹配.

[error] [client 127.0.0.1] Can't locate Spreadsheet/ParseExcel.pm in @INC (
 @INC contains: 
     /Library/Perl/Updates/5.8.8 
     /System/Library/Perl/5.8.8/darwin-thread-multi-2level 
     /System/Library/Perl/5.8.8 
     /Library/Perl/5.8.8/darwin-thread-multi-2level 
     /Library/Perl/5.8.8 
     /Library/Perl 
     /Network/Library/Perl/5.8.8/darwin-thread-multi-2level 
     ...
Run Code Online (Sandbox Code Playgroud)

在OSX上运行perl作为CGI时@INC如何设置 - 以及如何覆盖它?

ike*_*ami 6

构建@INC时初始值是硬编码的perl,但可以通过多种方式进行修改.这里最方便的是

SetEnv PERL5LIB ...
Run Code Online (Sandbox Code Playgroud)

从Apache配置中,或使用

use lib qw( ... );
Run Code Online (Sandbox Code Playgroud)

从Perl脚本中.

也就是说,使用Perl 5.8.9和Perl 5.8.8安装的模块是不安全的(尽管反过来是安全的).更糟糕的是,一个似乎是一个线程Perl而另一个不是.修改@INC根本不起作用.

您需要使用与perl要用于运行脚本的模块相同的方式安装模块,或者必须使用与perl用于安装模块的脚本相同的方式运行脚本.