Macos 启动lighttpd时perl@INC未完成

Macos 启动lighttpd时perl@INC未完成,macos,perl,lighttpd,Macos,Perl,Lighttpd,我正在尝试在iMac(Catalina 10.15.6)上运行TrinotateWeb(3.2.1版)。它使用light浏览器lighttpd(v1.4.55),这是我用自制软件安装的 启动服务器时,它会抱怨在@INC中找不到HTML/Template.pm: Can't locate HTML/Template.pm in @INC (you may need to install the HTML::Template module) (@INC contains: /Library/Pe

我正在尝试在iMac(Catalina 10.15.6)上运行TrinotateWeb(3.2.1版)。它使用light浏览器lighttpd(v1.4.55),这是我用自制软件安装的

启动服务器时,它会抱怨在@INC中找不到HTML/Template.pm:

Can't locate HTML/Template.pm in @INC (you may need to install the HTML::Template module) 
(@INC contains: 
/Library/Perl/5.18/darwin-thread-multi-2level 
/Library/Perl/5.18 
/Network/Library/Perl/5.18/darwin-thread-multi-2level 
/Network/Library/Perl/5.18 
/Library/Perl/Updates/5.18.4 
/System/Library/Perl/5.18/darwin-thread-multi-2level 
/System/Library/Perl/5.18 
/System/Library/Perl/Extras/5.18/darwin-thread-multi-2level 
/System/Library/Perl/Extras/5.18 
.) at /Applications/Trinotate-v3.2.1/TrinotateWeb/cgi-bin/index.cgi line 15.
BEGIN failed--compilation aborted at 
/Applications/Trinotate-v3.2.1/TrinotateWeb/cgi-bin/index.cgi line 15.
但是,HTML/Template.pm很好地安装在文件夹
/Users/simon/perl5/lib/perl5
中。它是使用
cpan HTML::Template
安装的

问题似乎源于@INC

My.zshrc配置文件使用PERL5LIB参考上述位置:

PATH="/Users/simon/perl5/bin${PATH:+:${PATH}}"; export PATH;
PERL5LIB="/Users/simon/perl5/lib/perl5${PERL5LIB:+:${PERL5LIB}}"; export PERL5L$
PERL_LOCAL_LIB_ROOT="/Users/simon/perl5${PERL_LOCAL_LIB_ROOT:+:${PERL_LOCAL_LIB$
PERL_MB_OPT="--install_base \"/Users/simon/perl5\""; export PERL_MB_OPT;
PERL_MM_OPT="INSTALL_BASE=/Users/simon/perl5"; export PERL_MM_OPT;
在终端中,@INC包含PERL5LIB,因此链接HTML/Template.pm:

➜  ~ perl -V
Summary of my perl5 (revision 5 version 18 subversion 4) configuration:
   
  Platform:
    osname=darwin, osvers=19.0, archname=darwin-thread-multi-2level
    uname='darwin osx397.sd.apple.com 19.0 darwin kernel version 18.0.0: tue jul 9 11:12:08 pdt 2019; root:xnu-4903.201.2.100.7~1release_x86_64 x86_64 '
    config_args='-ds -e -Dprefix=/usr -Dccflags=-g  -pipe  -Dldflags= -Dman3ext=3pm -Duseithreads -Duseshrplib -Dinc_version_list=none -Dcc=cc'
    hint=recommended, useposix=true, d_sigaction=define
    useithreads=define, usemultiplicity=define
    useperlio=define, d_sfio=undef, uselargefiles=define, usesocks=undef
    use64bitint=define, use64bitall=define, uselongdouble=undef
    usemymalloc=n, bincompat5005=undef
  Compiler:
    cc='cc', ccflags =' -g -pipe -fno-common -DPERL_DARWIN -fno-strict-aliasing -fstack-protector',
    optimize='-Os',
    cppflags='-g -pipe -fno-common -DPERL_DARWIN -fno-strict-aliasing -fstack-protector'
    ccversion='', gccversion='4.2.1 Compatible Apple LLVM 11.0.3 (clang-1103.0.29.20) (-macos10.15-objc-selector-opts)', gccosandvers=''
    intsize=4, longsize=8, ptrsize=8, doublesize=8, byteorder=12345678
    d_longlong=define, longlongsize=8, d_longdbl=define, longdblsize=16
    ivtype='long', ivsize=8, nvtype='double', nvsize=8, Off_t='off_t', lseeksize=8
    alignbytes=8, prototype=define
  Linker and Libraries:
    ld='cc', ldflags =' -fstack-protector'
    libpth=/usr/lib /usr/local/lib
    libs= 
    perllibs=
    libc=, so=dylib, useshrplib=true, libperl=libperl.dylib
    gnulibc_version=''
  Dynamic Linking:
    dlsrc=dl_dlopen.xs, dlext=bundle, d_dlsymun=undef, ccdlflags=' '
    cccdlflags=' ', lddlflags=' -bundle -undefined dynamic_lookup -fstack-protector'


Characteristics of this binary (from libperl): 
  Compile-time options: HAS_TIMES MULTIPLICITY PERLIO_LAYERS
                        PERL_DONT_CREATE_GVSV
                        PERL_HASH_FUNC_ONE_AT_A_TIME_HARD
                        PERL_IMPLICIT_CONTEXT PERL_MALLOC_WRAP
                        PERL_PRESERVE_IVUV PERL_SAWAMPERSAND USE_64_BIT_ALL
                        USE_64_BIT_INT USE_ITHREADS USE_LARGE_FILES
                        USE_LOCALE USE_LOCALE_COLLATE USE_LOCALE_CTYPE
                        USE_LOCALE_NUMERIC USE_PERLIO USE_PERL_ATOF
                        USE_REENTRANT_API
  Locally applied patches:
    /Library/Perl/Updates/<version> comes before system perl directories
    installprivlib and installarchlib points to the Updates directory
  Built under darwin
  Compiled at Jun  5 2020 17:34:07
  %ENV:
    PERL5LIB="/Users/simon/perl5/lib/perl5"
    PERL_LOCAL_LIB_ROOT="/Users/simon/perl5"
    PERL_MB_OPT="--install_base "/Users/simon/perl5""
    PERL_MM_OPT="INSTALL_BASE=/Users/simon/perl5"
  @INC:
    /Users/simon/perl5/lib/perl5/5.18.4/darwin-thread-multi-2level
    /Users/simon/perl5/lib/perl5/5.18.4
    /Users/simon/perl5/lib/perl5/darwin-thread-multi-2level
    /Users/simon/perl5/lib/perl5
    /Library/Perl/5.18/darwin-thread-multi-2level
    /Library/Perl/5.18
    /Network/Library/Perl/5.18/darwin-thread-multi-2level
    /Network/Library/Perl/5.18
    /Library/Perl/Updates/5.18.4
    /System/Library/Perl/5.18/darwin-thread-multi-2level
    /System/Library/Perl/5.18
    /System/Library/Perl/Extras/5.18/darwin-thread-multi-2level
    /System/Library/Perl/Extras/5.18
    .
➜  ~ perl-V
我的perl5(修订版5版本18 subversion 4)配置摘要:
站台:
osname=darwin,osvers=19.0,archname=darwin-thread-multi-2level
uname='darwin osx397.sd.apple.com 19.0达尔文内核版本18.0.0:tue jul 9 11:12:08 pdt 2019;根目录:xnu-4903.201.2.100.7~1release_x86_64 x86_64'
config_args='-ds-e-Dprefix=/usr-Dccflags=-g-pipe-Dldflags=-Dman3ext=3pm-duseireads-Duseshrplib-Dinc_version_list=none-Dcc=cc'
提示=推荐,使用POSIX=真,d_sigaction=定义
useithreads=define,useithmultiplicity=define
useperlio=define,d_sfio=undef,uselagefiles=define,usesocks=undef
use64bitint=define,use64bitall=define,uselongdouble=undef
usemymalloc=n,bincompat5005=undef
编译器:
cc='cc',ccflags='-g-pipe-fno common-DPERL_DARWIN-fno严格别名-fstack protector',
优化='-Os',
cppflags='-g-pipe-fno common-DPERL_DARWIN-fno严格别名-fstack protector'
ccversion='',GCCVVersion='4.2.1兼容苹果LLVM 11.0.3(clang-1103.0.29.20)(-macos10.15-objc-selector-opts),gccosandvers=''
intsize=4,longsize=8,ptrsize=8,doublesize=8,byteorder=12345678
d_longlong=define,longlongsize=8,d_longdbl=define,longdblsize=16
ivtype='long',ivsize=8,nvtype='double',nvsize=8,Off\u t='Off\u t',lseeksize=8
alignbytes=8,prototype=define
链接器和库:
ld='cc',ldflags='-fstack-protector'
libpth=/usr/lib/usr/local/lib
libs=
珍珠=
libc=,so=dylib,useshrplib=true,libperl=libperl.dylib
gnulibc_版本=“”
动态链接:
dlsrc=dl_dlopen.xs,dlext=bundle,d_dlsymun=unde,ccdlflags=''
cccdlflags='',lddlflags='-bundle-未定义的动态查找-fstack保护器'
此二进制文件的特征(来自libperl):
编译时选项:具有\u倍的多重性PERLIO\u层
PERL\u不创建\u GVSV
PERL\u HASH\u FUNC\u一次一个\u
PERL\u隐式\u上下文PERL\u MALLOC\u WRAP
PERL_PRESERVE_IVUV PERL_SAWAMPERSAND USE_64_BIT_ALL
使用64位文件使用ITHEREAD使用大文件
使用区域设置使用区域设置整理使用区域设置类型
使用语言环境使用数字使用PERLIO使用PERL
使用可重入API
本地应用的修补程序:
/Library/Perl/Updates/位于系统Perl目录之前
installprivlib和installarchlib指向更新目录
建立在达尔文的统治之下
于2020年6月5日17:34:07编制
%环境:
PERL5LIB=“/Users/simon/perl5/lib/perl5”
PERL_LOCAL_LIB_ROOT=“/Users/simon/perl5”
PERL_MB_OPT=“--install_base”/Users/simon/perl5”
PERL_MM_OPT=“INSTALL_BASE=/Users/simon/perl5”
@公司:
/Users/simon/perl5/lib/perl5/5.18.4/darwin-thread-multi-2level
/Users/simon/perl5/lib/perl5/5.18.4
/Users/simon/perl5/lib/perl5/darwin-thread-multi-2level
/用户/simon/perl5/lib/perl5
/Library/Perl/5.18/darwin-thread-multi-2level
/Library/Perl/5.18
/Network/Library/Perl/5.18/darwin-thread-multi-2level
/网络/库/Perl/5.18
/Library/Perl/Updates/5.18.4
/System/Library/Perl/5.18/darwin-thread-multi-2level
/System/Library/Perl/5.18
/System/Library/Perl/Extras/5.18/darwin-thread-multi-2level
/System/Library/Perl/Extras/5.18
.
我不明白为什么@INC在执行lighttpd时没有将所有路径列为上面所示的实际环境?

lighttpd exec直接是您的CGI(或FastCGI),所以如果您的脚本是xxxxx.pl并且包含
#/usr/bin/perl
,这就是执行的内容。(更明确地说,没有执行zsh,也没有阅读.zshrc,正如其他人在评论中所说的那样)

您可以更新这些脚本中的第一行以包含
#/usr/bin/perl-I..
,或者您可以修改lighttpd.conf以指定:

setenv.add-environment=(“PERL5LIB”=>“…”)

您还可以指示mod_cgi执行zsh shell脚本来执行perl,但这样做速度较慢,效率较低

cgi.assign=(“.pl”=>”/home/simon/bin/zsh bounce perl”)

并让
zsh bounce perl
脚本包含如下内容

#!/usr/bin/zsh
exec perl "$@"

我再次验证了在执行脚本
/Applications/Trinotate-v3.2.1/TrinotateWeb/cgi-bin/index.cgi
时使用了哪个perl:
#/usr/bin/env perl

因此,我执行了以下
test.pl
包含:

#!/usr/bin/env perl
print $_, "\n" for @INC;
它很好地返回了我的完整@INC,其中
HTML/Template.pm
位于:

➜  Desktop perl test.pl
/Users/simon/perl5/lib/perl5/5.18.4/darwin-thread-multi-2level
/Users/simon/perl5/lib/perl5/5.18.4
/Users/simon/perl5/lib/perl5/darwin-thread-multi-2level
/Users/simon/perl5/lib/perl5
/Library/Perl/5.18/darwin-thread-multi-2level
/Library/Perl/5.18
/Network/Library/Perl/5.18/darwin-thread-multi-2level
/Network/Library/Perl/5.18
/Library/Perl/Updates/5.18.4/darwin-thread-multi-2level
/Library/Perl/Updates/5.18.4
/System/Library/Perl/5.18/darwin-thread-multi-2level
/System/Library/Perl/5.18
/System/Library/Perl/Extras/5.18/darwin-thread-multi-2level
/System/Library/Perl/Extras/5.18
.
根据用户的建议,我尝试使用
sudocpanhtml::Template
安装具有root权限的包。该软件包安装在
/Library/Perl/5.18


通过此解决方案,lighttpd现在可以完美地工作。

lighttpd是否由不同于simon的用户运行?也许它没有权限读取/Users/simon下的文件?我不熟悉lighttpd,但我猜它是作为一种服务运行的,从来不会触及您的
.zshrc
文件?我喜欢在我的home dir中安装整个
perl
(例如使用
perlbrew
)而不是只安装模块(例如使用local::lib)的少数(但主要)原因之一,即您所说的模块安装路径