Как я могу установить Perl DBI на Mac OS X, чтобы Apache мог его найти?

Я пытаюсь настроить среду разработки Perl на своем ноутбуке Mac, и мне очень трудно заставить ее работать. Я думал, что все настроено правильно, но когда я пытаюсь запустить пример сценария, он сообщает об ошибках с модулем 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) обновить способ установки модуля, чтобы установить их в один из каталоги поиска. Я, честно говоря, не знаю, какой вариант имеет больше смысла, и мог бы использовать руководство по этому поводу.

Как вы, наверное, можете сказать, я довольно потерян в данный момент. Пожалуйста помоги!!! Заранее спасибо.


person Russell C.    schedule 01.05.2010    source источник
comment
Perl, который использует Apache, — это системный perl, который устанавливается в системные каталоги, и это perl 5.10.0. Perl, который вы используете для сборки и установки модулей, представляет собой локально установленный perl 5.8.9.   -  person hobbs    schedule 01.05.2010
comment
@hobbs - я сам думал об этом, но не мог понять, почему такая разница в версиях. Как мне с этим справиться? Могу ли я установить его так, чтобы команда perl была системной версией perl 5.10.0? Если нет, то как бы вы порекомендовали мне использовать правильный вызов perl для компиляции модулей?   -  person Russell C.    schedule 01.05.2010
comment
C. вы можете и, вероятно, должны это сделать, но мои навыки системного администратора Mac не на высоте. В качестве обходного пути попробуйте выполнить /usr/bin/perl Makefile.PL при сборке материала, а затем он должен собраться для этого конкретного Perl и установить в его каталоги.   -  person hobbs    schedule 01.05.2010


Ответы (3)


Похоже, вы уже установили другой Perl через macports (/opt/local — это место, куда попадают все установки macports), и /opt/local/bin находится раньше в вашем $PATH, чем системный Perl в /usr/bin. Это нормально, если вам нравится работать с Perl 5.8.9, а не с Perl 5.10.0 (подсказка: если вы не уверены в различиях, то различия не имеют значения).

Обычно рекомендуется не производить дополнительных установок Perl в системе. Apple может обновлять компоненты с помощью регулярных обновлений системы, что может помешать любым сделанным вами изменениям, и если вы допустили ошибку при установке, ее трудно исправить, не выполняя полную переустановку системы или не имея серьезного понимания внутренностей операционной системы. . Итак, поскольку у вас уже есть другая готовая установка Perl, я настоятельно рекомендую вам придерживаться этой.

Однако вам, вероятно, не следует устанавливать библиотеки вручную, если на macports уже есть дистрибутив. Я использовал port search dbi и port search dbd, чтобы найти их: дистрибутивы называются p5-dbi и p5-dbd-mysql. Вы можете установить их, как и любой другой модуль macports: с помощью sudo port install <distroname>. (Возможно, вам также потребуется установить сам mod_perl.)

После этого вам просто нужно указать Apache/mod_perl использовать эту установку Perl, а не системный perl. Я никогда не делал этого, поэтому я не могу посоветовать, как лучше это сделать. Однако быстрый поиск на http://superuser.com предполагает, что версия apache для macports будет работать по умолчанию (через тот же порядок $PATH), так что я бы просто попробовал и посмотрел :).

person Ether    schedule 01.05.2010

Отличный ответ, Эфир. Проделав это слишком много раз, чтобы сосчитать, я могу дать вам несколько советов:

Примечание. По-видимому, я ограничен одной ссылкой в ​​сообщении, поэтому мне пришлось удалить все свои аннотации. К счастью, есть Delicious, где я сохранил их все с тегом stackoverflowmacports. . Любое место ниже, где я удалил ссылку, чтобы соответствовать нелепой мере защиты от спама Stack Overflow, я пометил ее знаком (*).

  1. Если для вас важно иметь надежно работающую среду разработки в любое время, полагайтесь на ПО в комплекте с Mac OS X как можно НЕМНОГО. Я люблю Apple, но они абсолютно без колебаний ломают пользовательские настройки своего программного обеспечения как можно чаще.

  2. Если № 1 звучит как то, что вам нужно сделать, Macports — ОТЛИЧНЫЙ выбор. Раньше я использовал Fink, но они давно ушли в прошлое с точки зрения простоты использования и спектра доступного программного обеспечения. Самый простой способ установить macports — использовать метод установки бинарного пакета (*).

  3. Как отмечает Эфир, когда у вас все настроено правильно, MySQL, PHP и Apache, предоставляемые Macports, хорошо работают вместе, не мешая установленным в системе аналогам. Большая часть этого связана с вашей настройкой PATH, но все эти детали обрабатываются установщиком пакетов после выполнения скрипта (*).

  4. Как только вы сядете в поезд Macports, он должен стать самым первым местом, где вы будете искать какое-либо программное обеспечение. port search и port info - постоянные компаньоны. В настоящее время у них есть 6863 порта (*), которые охватывают БОЛЬШИНСТВО ваших баз.

  5. Если вам нужно выйти за пределы области Macports, чтобы найти что-то, установите это в /usr/local. Эта часть иерархии файловой системы принадлежит вам. Не поддавайтесь ложному чувству безопасности и не думайте, что, поскольку Macports не имеет того, что вы устанавливаете, можно поместить его в /opt/local, потому что неизменно это программное обеспечение установит некоторую зависимость, которая ТАКЖЕ будет зависимостью для какой-то части. программного обеспечения Macports в будущем, и Macports не позволит установить порт, если какой-либо из его файлов перезапишет существующий файл, не управляемый Macports (если только вы не форсируете его, что всегда является дурным тоном)

  6. Если вы работаете с Perl и используете версию Macports, вы абсолютно точно окажетесь в ситуации, когда у Macports нет того модуля CPAN, который вы ищете. (И, действительно, учитывая, что модулей 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. Вы можете установить переменную среды PERL5LIB в сценариях инициализации вашей оболочки, чтобы дополнительно искать модули в /usr/local/lib/perl5. Просто возьмите вывод @INC из perl -V и прикрепите его к концу...

  7. И наконец... Использование системных ежедневных сценариев инициализации или стороннего программного обеспечения, такого как Anacron (*) или MacPorts Notifier (*) (оба доступны через порты MacPort), обязательно часто обновляйте программное обеспечение. У вас нет Материнского Apple, защищающего вас с помощью обновлений программного обеспечения для установленного программного обеспечения Macports, которое содержит столько же ошибок и эксплойтов безопасности, сколько то же самое программное обеспечение, поставляемое Apple.

    Часто обновляя, вы опередите злодеев, а за счет автоматизации обновления действительно произойдут, и вы не закончите, как я в прошлом, с полными выходными, испорченными из-за того, что вы гора устаревших портов для обновления. Примечание. Macports устанавливает свои обновления, и если в какой-то момент произойдет сбой, ваша текущая версия продолжит работать. Apple могла бы кое-чему у них поучиться, скажу я вам…

Итак, это все, что я могу придумать на данный момент. Надеюсь, приведенные выше уроки помогут вам быстро начать работу и сэкономят все время, усилия и стресс, которые я испытал в прошлые годы при его изучении. Я бы сказал, что это все же намного лучше, чем альтернатива: ненавидеть Apple, потому что они ломают все ваши хорошие вещи... :-)

person Jay Allen    schedule 09.05.2010

У меня была аналогичная проблема с Apache, использующим неправильный Perl. Я исправил это, добавив следующие строки в мой файл 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
person i alarmed alien    schedule 15.11.2010