我正在尝试在我的Mac笔记本电脑上设置Perl开发环境,并且一直很难让它正常工作。我以为我已经正确配置了所有内容,但是当我尝试运行示例脚本时,它报告了DBI模块的错误,无法访问数据库。
以下是Apache错误日志中报告的内容:
[Fri Apr 30 23:11:33 2010] [error] [client 127.0.0.1] Can't locate DBI.pm in @INC (@INC contains: /Library/Perl/Updates/5.10.0/darwin-thread-multi-2level /Library/Perl/Updates/5.10.0 /System/Library/Perl/5.10.0/darwin-thread-multi-2level /System/Library/Perl/5.10.0 /Library/Perl/5.10.0/darwin-thread-multi-2level /Library/Perl/5.10.0 /Network/Library/Perl/5.10.0/darwin-thread-multi-2level /Network/Library/Perl/5.10.0 /Network/Library/Perl /System/Library/Perl/Extras/5.10.0/darwin-thread-multi-2level /System/Library/Perl/Extras/5.10.0 .) at main.pm line 5.
我使用以下forum post中指定的命令手动下载并安装了两个模块以使用MAMP:
For DBI
1. cd /Library/Perl/DBI-1.611
2. sudo Perl Makefile.PL
3. sudo make
4. sudo make install
For DBD
1. cd /Library/Perl/DBD-mysql-4.014
2. sudo Perl Makefile.PL --mysql_config=/Applications/MAMP/Library/bin/mysql_config
3. sudo make
4. sudo make install
在运行上述命令时我注意到的是,这些文件似乎安装在'/opt/local/lib/perl5/site_perl/5.8.9/darwin-2level/'目录中,似乎没有是Apache在本文开头的错误中提到的搜索目录之一。以下是我在安装过程中看到的内容:
$ sudo make install
Files found in blib/arch: installing files in blib/lib into architecture dependent library tree
Installing /opt/local/lib/perl5/site_perl/5.8.9/darwin-2level/auto/DBI/DBI.bundle
Installing /opt/local/lib/perl5/site_perl/5.8.9/darwin-2level/auto/DBI/dbipport.h
Installing /opt/local/lib/perl5/site_perl/5.8.9/darwin-2level/auto/DBI/DBIXS.h
Installing /opt/local/lib/perl5/site_perl/5.8.9/darwin-2level/auto/DBI/dbixs_rev.h
Installing /opt/local/lib/perl5/site_perl/5.8.9/darwin-2level/auto/DBI/Driver.xst
Installing /opt/local/lib/perl5/site_perl/5.8.9/darwin-2level/auto/DBI/Driver_xst.h
Installing /opt/local/lib/perl5/site_perl/5.8.9/darwin-2level/DBI.pm
Installing /opt/local/lib/perl5/site_perl/5.8.9/darwin-2level/TASKS.pod
Installing /opt/local/lib/perl5/site_perl/5.8.9/darwin-2level/DBD/DBM.pm
Installing /opt/local/lib/perl5/site_perl/5.8.9/darwin-2level/DBD/File.pm
Installing /opt/local/lib/perl5/site_perl/5.8.9/darwin-2level/DBD/Gofer.pm
Installing /opt/local/lib/perl5/site_perl/5.8.9/darwin-2level/DBI/Changes.pm
Installing /opt/local/lib/perl5/site_perl/5.8.9/darwin-2level/DBI/DBD.pm
Installing /opt/local/lib/perl5/site_perl/5.8.9/darwin-2level/DBI/Profile.pm
Installing /opt/local/lib/perl5/site_perl/5.8.9/darwin-2level/DBI/ProxyServer.pm
Installing /opt/local/lib/perl5/site_perl/5.8.9/darwin-2level/DBI/PurePerl.pm
Installing /opt/local/share/man/man3/DBD::DBM.3pm
Installing /opt/local/share/man/man3/DBD::File.3pm
Installing /opt/local/share/man/man3/DBD::Gofer.3pm
Installing /opt/local/share/man/man3/DBI.3pm
Installing /opt/local/share/man/man3/DBI::DBD.3pm
Installing /opt/local/share/man/man3/DBI::Profile.3pm
Installing /opt/local/share/man/man3/DBI::ProxyServer.3pm
Installing /opt/local/share/man/man3/DBI::PurePerl.3pm
Installing /opt/local/share/man/man3/TASKS.3pm
Installing /opt/local/bin/dbiprof
Installing /opt/local/bin/dbiproxy
Writing /opt/local/lib/perl5/site_perl/5.8.9/darwin-2level/auto/DBI/.packlist
Appending installation info to /opt/local/lib/perl5/5.8.9/darwin-2level/perllocal.pod
我的问题是,我做错了什么,我怎么能1)让Apache查找DBD&安装DBI模块或2)更新我安装模块的方式,将它们安装到其中一个搜索目录中。老实说,我不知道哪个选项更有意义,也可以使用指导。
你可能会说我现在很迷茫。请帮忙!!!提前谢谢。
答案 0 :(得分:4)
看起来您已经通过macports安装了另一个Perl(/ opt / local是所有macports安装的地方),而/ opt / local / bin在$PATH
中早于系统Perl在/ usr / bin中。没关系,如果你很高兴运行Perl 5.8.9而不是Perl 5.10.0(暗示:如果你不确定差异,那么差异并不重要)。
通常建议不要对系统Perl进行额外安装。 Apple可能会通过定期系统更新来升级组件,这可能会干扰您所做的任何修改,如果您在安装时出错,则很难在不进行完整系统重新安装或对操作系统内部有一些认真理解的情况下对其进行补救。 。所以,既然你已经准备好了另一个Perl安装,我强烈建议你坚持使用它。
但是,如果macport上已有分发版,您可能不应该手动安装库。我使用port search dbi
和port search dbd
来查找它们:分发名为p5-dbi和p5-dbd-mysql。您可以像使用sudo port install <distroname>
那样安装其他任何macports模块。 (您可能还需要自己安装mod_perl。)
之后,您只需要告诉Apache / mod_perl使用Perl安装而不是系统perl。我从来没有这样做过,所以我无法建议最好的方法。但是,对http://superuser.com的快速搜索表明,默认情况下会运行macaches版本的apache(通过相同的$ PATH排序),所以我只是试一试,看看:)。
答案 1 :(得分:2)
很棒的答案,以太。做了这么多次计算,我可以给你一些建议:
注意:我显然仅限于帖子中的单个链接,因此我必须删除所有注释。值得庆幸的是,有一个美味,我用stackoverflowmacports标签存储了它们。我在删除链接以适应Stack Overflow荒谬的反垃圾邮件措施的下方的任何地方,我用(*)标记了它。
如果始终拥有可靠的开发环境对您来说非常重要,请尽可能依赖于小型Mac OS X捆绑软件。我喜欢Apple,但他们对于尽可能经常破坏软件的自定义设置毫无疑问
如果#1听起来像你需要做的那样, Macports是一个很好的选择。我曾经使用过Fink,但是在易用性和可用软件范围方面,他们在很久以前就已经尘埃落定了。安装macports的最简单方法是通过二进制包安装方法(*)
正如以太提到的那样,当你正确设置好所有内容时,Macports提供的MySQL,PHP和Apache都能很好地协同工作,而不会对系统安装的模拟产生干扰。其中大部分与您的PATH设置有关,但所有这些细节都由包安装程序在飞行后脚本处理(*)
一旦你上了Macports列车,它应该成为你寻找任何软件的第一个地方。 port search
和port info
是不变的伴侣。他们目前有6863个端口(*),涵盖了你的基地。
如果您确实需要走出Macports领域以寻找内容,请将其安装在/usr/local
中。您可以使用文件系统层次结构的那一部分。不要陷入虚假的安全感,并认为因为Macports没有你正在安装的东西,所以可以把它放在/opt/local
中,因为软件总是会安装一些依赖,这也将是一个某些Macports软件的依赖性和Macports将不允许安装端口,如果其中任何一个文件将覆盖Macports的现有文件未管理(除非你强制它总是坏礼貌)
如果您使用Perl进行任何工作并使用Macports的版本,您绝对会发现自己处于Macports没有您正在寻找的CPAN模块的情况。 (而且,实际上,鉴于有25亿CPAN模块,谁能责怪他们?)。这种情况经常发生,您很可能厌倦了手动安装方法(*)(perl Makefile.PL; make; make test; sudo make install; cha; cha; cha
),并且很长时间以后您已经习惯使用Macports。
如果是这样,您绝对可以使用cpan (*)实用程序,CPANPLUS (*)或cpanminus (*)你的安装需求。只需确保在所选工具的配置中进行必要的调整,以指示它将模块安装到/ usr / local / lib / perl5中,忽略/opt/local/bin/perl
坚持认为模块进入/opt/local/lib/perl5
。您可以在shell的init脚本中设置PERL5LIB
环境变量,以便在/usr/local/lib/perl5
中查找模块。只需抓住@INC
的{{1}}输出并在结尾处添加...
最后......利用系统的每日初始化脚本或第三方软件,如Anacron (*)或MacPorts通知程序(*) (两者都可用到 MacPorts),请确保经常更新您的软件。您没有Apple Apple通过软件更新来保护您的Macports安装软件,它具有与Apple捆绑软件一样多的漏洞和安全漏洞。
通过频繁更新,你将保持领先于坏人并通过自动化,升级实际上发生并且你不会像我过去那样结束整个周末因为你有一大堆过时的港口需要升级。注意:Macports会更新其更新,如果它在任何时候失败,您当前的版本将继续工作。苹果可以从中学到一两件事,我告诉你......
所以,这就是我能想到的那一刻。希望上面的课程能让你快速前进,并节省我过去几年学习它所经历的所有时间,精力和压力。我认为它仍然比其他选择更好:恨苹果,因为它们打破了你所有的美好事物......: - )
答案 2 :(得分:0)
我使用错误的Perl与Apache有类似的问题。我通过将以下行附加到我的httpd.conf
文件来修复它:
SetEnv PATH [colon-separated list of directories]
SetEnv PERL5LIB [colon-sep'd list of directories]
就我而言,它看起来像这样:
SetEnv PATH /opt/local/bin:/opt/local/sbin:/usr/local/bin:/usr/local/mysql/bin:$PATH
SetEnv PERL5LIB /opt/local/lib:/usr/local/lib