Две версии Perl в Mac OS X? - PullRequest
       12

Две версии Perl в Mac OS X?

9 голосов
/ 13 августа 2010

Я установил модуль Template через CPAN на свой MacBook Pro, и он, кажется, установился правильно.

Но, когда я пытаюсь запустить скрипт, который включает в себя модуль Template, я получаю следующее:

Невозможно найти Template.pm в @INC (@INC содержит: / Users / purinkle / Sites / rob / modules /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 / Сеть / Библиотека / Perl / System /Библиотека / Perl / Extras / 5.10.0 / darwin-thread-multi-2level /System/Library/Perl/Extras/5.10.0.) На.компиляция прервана в ./index.pl строка 12.

Затем я думаю, что во время установки что-то пошло не так, и пытаюсь установить заново через CPAN, но получаю следующее сообщение:

Шаблон обновлен (2.22).

Затем я выполнил команду instmodsh, чтобы попытаться найти, где установлен модуль.В instmodsh перечислены следующие каталоги:

/ opt / local / bin

/ opt / local / lib / perl5 / site_perl / 5.8.9 / darwin-2level

/opt/local/lib/perl5/site_perl/5.8.9/darwin-2level/Template

/ opt / local / lib / perl5 / site_perl / 5.8.9 / darwin-2level / Template / Manual

/ opt / local / lib / perl5 / site_perl / 5.8.9 / darwin-2level / Template / Namespace

/ opt / local / lib / perl5 / site_perl / 5.8.9 / darwin-2level/ Template / Plugin

/ opt / local / lib / perl5 / site_perl / 5.8.9 / darwin-2level / Template / Stash

/ opt / local / lib / perl5 / site_perl / 5.8.9 / darwin-2level / Template / Tools

/ opt / local / lib / perl5 / site_perl / 5.8.9 / darwin-2level / Template / Tutorial

/ opt / local / lib/perl5/site_perl/5.8.9/darwin-2level/auto/Template/Stash/XS

/ opt / local / share / man / man1

/ opt / local / share / man/ man3

Похоже, у меня есть несколько установленных версий Perl (5.8.9 и 5.10.0), и это вызывает путаницу между CPAN aи другие сценарии Perl.

Как это проверить и как можно решить эту проблему?

Я выполнил команды

which perl
which cpan

, и они оба возвращают /opt / local / bin

Running

find / -name perl

возвращает

find: / dev / fd / 3: не каталог

find: / dev / fd / 4: не каталог

/ opt / local / bin / perl

/ opt / local / etc / bash_completion.d / perl

/opt / local / var / macports / software / bash-creation / 1.2_0 / opt / local / etc / bash_completion.d / perl

/ opt / local / var / macports / software / perl5.8 / 5.8.9_3 / opt / local / bin / perl

/ opt / local / var / macports / sources / rsync.macports.org / release / ports / perl

/ usr / bin / perl

/ usr / local / bin / perl

/ usr / share / file / magic / perl

и

find / -name cpan

возвращает

/ opt / local / bin / cpan

/ opt / local / var / macports / software / perl5.8 / 5.8.9_3 / opt / local / bin / cpan

/ Пользователи / purinkle / .cpan / build / CPAN-1.9402-KtN827 / blib / script / cpan

/ Users / purinkle / .cpan / build / CPAN-1.9402-KtN827 / scripts / cpan

/ Users / purinkle / .cpan / build / CPAN-1.9402-zb0AeX / blib / script / cpan

/ Users / purinkle / .cpan / build / CPAN-1.9402-zb0AeX / scripts / cpan

/ usr / bin / cpan

Выполнение

perl -e 'print join "\n", @INC'

возвращает

/ Пользователи / purinkle / Сайты / грабли / модули

/ opt / local / lib / perl5 / site_perl /5.8.9 / darwin-2level

/ opt / local / lib / perl5 / site_perl / 5.8.9

/ opt / local / lib / perl5 / site_perl

/Opt / местные / Библиотека / perl5 / vendor_perl / 5.8.9 / Darwin-2Уровень

/ opt / local / lib / perl5 / vendor_perl / 5.8.9

/ opt / local / lib / perl5 / vendor_perl

/ opt / local / lib / perl5 / 5.8.9 / darwin-2level

/ opt / local / lib / perl5 / 5.8.9

Ответы [ 6 ]

16 голосов
/ 13 августа 2010

OS X поставляется с двумя версиями Perl. 5.10.0 является значением по умолчанию, поэтому / usr / bin / perl и / usr / bin / cpan должны общаться с 5.10.0.

Проблема в том, что у вас три. /opt/local указывает на установку MacPorts , которая, вероятно, установила Perl в качестве зависимости, когда вы не искали. Это / opt / local / bin / perl и, вероятно, это perl по умолчанию в вашем пути. Проверьте с which perl. Это также означает, что вы, вероятно, используете cpan MacPorts, проверьте с помощью which cpan и, таким образом, установили Template Toolkit в версию MacPorts.

Я собираюсь догадаться, либо вы запускаете программу с #!/usr/bin/perl вверху, либо используете встроенный mod_perl, либо вы запускаете ее как пользователь, который не является вами. Все они будут ссылаться на Perl по умолчанию в OS X, а не на ваш MacPorts.

Macports имеет 5,10 и 5,12, но "perl" в Macports по-прежнему 5,8. Вы можете установить 5.10 в Macports.

Что касается того, как решить эту проблему ... если вы используете mod_perl на этом компьютере, используйте Perl Macports. Будет проще установить модули, и они будут обновляться лучше, чем версия ОС.

Чтобы оградить себя от путаницы в будущем, вы можете добавить псевдонимы в /usr/local/bin или ~/bin для perl, perldoc и cpan в Perl по вашему выбору. Это предотвратит инсталляцию perl на вашем пути и угон чего-либо еще.

3 голосов
/ 25 мая 2011

Есть еще одно решение, которое, как мне кажется, намного проще: просто установите еще одну копию модуля Perl и установите его в том месте, где вы хотите его использовать. Например, если у вас есть две установки Perl в вашей системе, одна в / usr / bin и другая в / opt / local / bin, и ваша команда cpan по умолчанию устанавливает модуль в установку / opt / local / bin, но ваша Приложение (Apache или что-то еще) вместо этого ищет модуль в установке / usr / bin, тогда вам просто нужно вызвать cpan как «/ usr / bin / cpan» при установке модуля. Это решает проблему без необходимости редактирования вашего скрипта или конфигурации Apache и т. Д.

3 голосов
/ 14 августа 2010

Я прошел этот процесс около полутора месяцев назад, когда настраивал новый MacBook Pro.Установка Perl для MacPorts, переключение на /usr/bin/env perl и обновление моего PATH (что, судя по комментариям к ответу Шверна, похоже на то, где вы сейчас находитесь) было простым и достаточно хорошо задокументировано.

Выяснение того, как получить право perl показываться первым в апаче PATH, с другой стороны, было адским и занимало путь слишком много прибегая к помощи, перемежающейся с периодами удара головой о стену дляОблегчение.

Итак, чтобы избавить вас от этого, я в конечном итоге нашел ответ: вам нужно добавить PATH ключ к /System/Library/LaunchDaemons/org.apache.httpd.plist с PATH, который вы хотите использовать apache.Предполагая, что вы так же незнакомы с форматом .plist, как я был в то время, вот мой полный текущий org.apache.httpd.plist, который отлично работает для меня:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
        <key>Disabled</key>
        <true/>
        <key>Label</key>
        <string>org.apache.httpd</string>
        <key>ProgramArguments</key>
        <array>
                <string>/usr/sbin/httpd</string>
                <string>-D</string>
                <string>FOREGROUND</string>
        </array>
        <key>OnDemand</key>
        <false/>
        <key>SHAuthorizationRight</key>
        <string>system.preferences</string>
        <key>EnvironmentVariables</key>
        <dict>
                <key>PATH</key>
                <string>/opt/local/bin:/opt/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin</string>
        </dict>
</dict>
</plist>

Скопируйте / вставьте это ввашей системы (или просто добавьте ключ EnvironmentVariables и сопровождающий его dict к существующему файлу), перезапустите apache, и вы должны быть настроены.(Если я не ошибаюсь, и это было что-то еще, что на самом деле работало на меня, но я почти уверен, что это было так.)

2 голосов
/ 13 августа 2010

начать с этих 2 команд:

which perl
which cpan

если вы получаете разные пути к исполняемым файлам, то, скорее всего, у вас установлены 2 версии или Perl. Если они совпадают, скорее всего, у вас неправильно настроен perl @INC. Вы можете добавить пути к @INC bny, включая это в самом начале вашего скрипта (после шебанга):

BEGIN {

        push @INC,"/path/to/cpan/modules";

        }  

В любом случае сделать это:

find / -name perl
find / -name cpan

посмотри, что ты получишь. Это скажет вам, если у вас есть несколько версий или нет.

1 голос
/ 05 ноября 2014

Я столкнулся с подобной проблемой; в моем случае проблема заключалась в том, что я запускал cpan как сам, а не как root, поэтому он устанавливал только модули cpan в моем каталоге пользователя, который глобальный @INC не включал. Просто запустите «sudo cpan» вместо «cpan», установите свои модули, и они должны быть загружены просто отлично.

0 голосов
/ 19 октября 2017

У меня была такая же проблема, понятия не имею, как это случилось. Я подозреваю, что это как-то произошло во время обновления XCode. Я исправил это, переустановив Perl на моем Mac вручную. Я использовал последнюю версию, как описано здесь:

http://search.cpan.org/~shay/perl/README.macosx

  curl -O http://www.cpan.org/src/perl-5.26.1.tar.gz
  tar -xzf perl-5.26.1.tar.gz
  cd perl-5.26.1
  ./Configure -des -Dprefix=/usr/local/
  make
  make test
  sudo make install
...