2

我正在尝试在我的 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.

我使用此论坛帖子中指定的以下命令手动下载并安装了这两个模块以使用 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) 更新我安装模块的方式以将它们安装到其中之一搜索目录。老实说,我不知道哪个选项更有意义,也可以使用指导。

你可能会说我现在很迷茫。请帮忙!!!提前致谢。

4

3 回答 3

4

看起来您已经通过macports安装了另一个 Perl (/opt/local 是所有 macports 安装所在的位置),并且 /opt/local/bin$PATH比 /usr/bin 中的系统 Perl 更早。没关系,如果您乐于运行 Perl 5.8.9 而不是 Perl 5.10.0(提示:如果您不确定差异,那么差异无关紧要)。

通常建议不要对系统 Perl 进行额外安装。Apple 可能会通过定期的系统更新来升级组件,这可能会干扰您所做的任何修改,如果您在安装时出现错误,如果不进行完整的系统重新安装或对操作系统有一定的了解,就很难补救. 因此,既然您已经准备好另一个 Perl 安装,我强烈建议您坚持使用那个。

但是,如果 macports 上已经有可用的发行版,您可能不应该手动安装库。我使用port search dbiport search dbd找到它们:这些分布被命名为 p5-dbi 和 p5-dbd-mysql。您可以像安装任何其他 macports 模块一样安装它们:使用sudo port install <distroname>. (您可能也需要安装 mod_perl 本身。)

之后,您只需要告诉 Apache/mod_perl 使用该 Perl 安装而不是系统 perl。我从来没有这样做过,所以我无法建议最好的方法。但是,在http://superuser.com上的快速搜索表明 macports 版本的 apache 将默认运行(通过相同的 $PATH 顺序),所以我只是尝试一下:)。

于 2010-05-01T16:57:47.730 回答
2

很好的答案,以太。这样做的次数太多了,我可以给你一些建议:

注意:我显然仅限于帖子中的单个链接,因此我不得不删除所有注释。值得庆幸的是,有一个 Delicious,我用stackoverflowmacports标记将它们全部存储在其中。在下面我删除链接以适应 Stack Overflow 荒谬的反垃圾邮件措施的任何地方,我都用(*)标记了它。

  1. 如果始终拥有可靠运行的开发环境对您很重要,请尽可能依赖 Mac OS X 捆绑软件。我喜欢 Apple,但他们对尽可能频繁地破坏其软件的自定义设置毫无疑虑

  2. 如果 #1 听起来像是您需要做的,那么Macports 是一个极好的选择。我曾经使用过 Fink,但在易用性和可用软件范围方面,它们在很久以前就被抛在了后面。安装 macports 最简单的方法是通过二进制包安装方法(*)

  3. 正如 Ether 所提到的,当您正确设置所有内容时,Macports 提供的 MySQL、PHP 和 Apache 都可以很好地协同工作,而不会受到系统安装的类似物的干扰。其中大部分与您的 PATH 设置有关,但所有这些细节都由包安装程序飞行后脚本(*)处理

  4. 一旦您乘坐 Macports 火车,它应该成为您寻找任何软件的第一站。port search并且port info是不变的伙伴。他们目前有 6863 个端口(*),涵盖了您的大部分基地。

  5. 当您确实需要在 Macports 领域之外寻找某些东西时,请将其安装在/usr/local. 文件系统层次结构的那一部分是您可以使用的。不要陷入一种虚假的安全感,并认为因为 Macports 没有您要安装的东西,所以可以将其放入,/opt/local因为该软件总是会安装一些依赖项,这些依赖项也将成为某些部分的依赖项Macports 软件下线并且 Macports 将不允许安装端口,如果它的任何文件会覆盖不是由 Macports 管理的现有文件(除非你强制它总是不礼貌的)

  6. 如果您使用 Perl 进行任何工作并且使用 Macports 的版本,那么您绝对会发现自己处于 Macports 没有您正在寻找的一个 CPAN 模块的情况。(而且,真的,鉴于有 25 亿个 CPAN 模块,谁能责怪它们呢?)。这种情况经常发生,您很可能会厌倦手动安装方法(*) ( perl Makefile.PL; make; make test; sudo make install; cha; cha; cha),并渴望您已经习惯了 Macports 的易用性。

    如果是这样,您绝对可以使用 cpan (*)实用程序、CPANPLUS (*)或 cpanminus (*)来满足您的所有安装需求。只需确保/opt/local/bin/perl对您选择的工具的配置进行必要的调整,以指示它将您的模块安装到 /usr/local/lib/perl5 中,而忽略/opt/local/lib/perl5. 您可以PERL5LIB在 shell 的初始化脚本中设置环境变量以另外查找/usr/local/lib/perl5模块。只需@INC从中获取输出perl -V并将其粘贴到最后...

  7. 最后... 利用系统的日常初始化脚本或第三方软件,如 Anacron (*)或 MacPorts Notifier (*)(均可通过MacPorts 获得),确保经常更新您的软件。您没有 Apple 妈妈使用 Macports 安装软件的软件更新来保护您,这些软件的错误和安全漏洞与 Apple 捆绑的相同软件一样多。

    通过频繁更新,您将领先于坏人,并且通过自动化,升级将真正发生,您不会像过去那样结束一个完整的周末,因为您有大量过时的端口要升级. 注意:Macports 分阶段进行更新,如果它在任何时候失败,您当前的版本将继续工作。苹果可以从他们那里学到一两件事,我告诉你......

所以,这就是我能想到的时刻。希望以上课程能让您快速上手,并节省我在过去几年中学习它时所经历的所有时间、精力和压力。我认为它仍然比替代方案好得多:讨厌苹果,因为它们破坏了你所有的好东西...... :-)

于 2010-05-09T03:25:13.187 回答
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
于 2010-11-15T16:42:25.080 回答