簡體   English   中英

Mac OS X中有兩個版本的Perl?

[英]Two versions of Perl in Mac OS X?

我已經在我的MacBook Pro上通過CPAN安裝了模板模塊,它似乎安裝正確。

但是,當我嘗試運行包含模塊模塊的腳本時,我得到以下內容:

無法在@INC中找到Template.pm(@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 / Network / Library / Perl /System/Library/Perl/Extras/5.10。 0 / darwin-thread-multi-2level /System/Library/Perl/Extras/5.10.0。)at ./index.pl第12行。

BEGIN失敗 - 編譯在./index.pl第12行中止。

然后我認為在安裝過程中出現問題並嘗試通過CPAN再次安裝但收到以下消息:

模板是最新的(2.22)。

然后我運行了instmodsh命令來嘗試找到模塊的安裝位置。 instmodsh列出了這些目錄:

/選擇/ 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

/選擇/本地/共享/人/ MAN1

/選擇/本地/共享/人/ man3

看起來我有一些如何安裝兩個不同版本的Perl(5.8.9和5.10.0),這導致CPAN和其他Perl腳本之間的混淆。

如何驗證此問題以及如何解決此問題?

我已經運行了命令

which perl
which cpan

他們都返回/ opt / local / bin

運行

find / -name perl

回報

find:/ dev / fd / 3:不是目錄

find:/ dev / fd / 4:不是目錄

/選擇/ local / bin中/ perl的

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

/opt/local/var/macports/software/bash-completion/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 /共享/文件/魔法/ perl的

find / -name cpan

回報

/選擇/ local / bin目錄/ CPAN

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

/Users/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/local/lib/perl5/vendor_perl/5.8.9/darwin-2level

/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

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 這也意味着你可能正在使用MacPorts的cpan,檢查which cpan ,從而將Template Toolkit安裝到MacPorts版本中。

我猜你要么在頂部使用#!/usr/bin/perl運行程序,要么你正在使用內置的mod_perl,或者你是以不是你的用戶身份運行它。 所有這些都將引用OS X的默認Perl而不是MacPorts安裝。

Macports有5.10和5.12,但Macports中的“perl”仍為5.8。 您可以在Macports中安裝5.10。

至於如何解決這個問題...如果你在該機器上使用mod_perl,請使用Macports的Perl。 安裝模塊會更容易,並且它將比操作系統版本更新。

為了防止將來混淆,您可以將/usr/local/bin~/bin別名添加到perl,perldoc和cpan中,添加到您選擇的Perl中。 這將阻止其他東西在您的路徑中安裝perl並劫持。

在設置新的MacBook Pro時,我在大約一個半月前完成了這個過程。 安裝了MacPorts perl,切換到/usr/bin/env perl ,並更新我的PATH (從Schwern的回答看起來就像你現在的位置一樣)很簡單,而且記錄得非常好。

搞清楚如何得到正確perl在Apache的第一個出現PATH ,在另一方面,是地獄和參與的方式太多的谷歌搜索穿插着打我的頭撞在牆上救濟的時期。

所以,為了省去你,我最終找到的答案是你需要將PATH密鑰添加到/System/Library/LaunchDaemons/org.apache.httpd.plist ,並使用您希望apache使用的PATH 假設你和我當時一樣不熟悉.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,您應該進行設置。 (除非我記錯了,而且其他東西實際上讓它適合我,但我很確定這就是它。)

還有另一個解決方案在我看來要簡單得多:只需安裝Perl模塊的另一個副本,然后將其安裝到要使用它的安裝中。 例如,如果您的系統上有兩個Perl安裝,一個在/ usr / bin中,另一個在/ opt / local / bin中,並且您的cpan命令默認將模塊安裝到/ opt / local / bin安裝中,但是app(Apache或其他)正在/ usr / bin安裝中尋找模塊,然后你需要在安裝模塊時調用cpan作為“/ usr / bin / cpan”。 這解決了問題,而無需編輯腳本或Apache配置等。

從這兩個命令開始:

which perl
which cpan

如果您獲得可執行文件的不同路徑,那么很有可能您安裝了2個版本或perl。 如果它們是相同的,那么你可能錯誤地配置了perl @INC。 您可以在腳本的最開頭(shebang之后)添加@INC bny的路徑,包括:

BEGIN {

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

        }  

在任何情況下都這樣做:

find / -name perl
find / -name cpan

看看你得到了什么。 這將告訴您是否有多個版本。

我遇到了類似的問題; 在我的情況下,問題是我一直在運行cpan而不是root用戶,所以它只在我的用戶目錄中安裝cpan模塊,全局@INC沒有包含。 只需運行'sudo cpan'而不是'cpan',安裝你的模塊,它們應該裝得很好。

我遇到了同樣的問題,不知道是怎么回事。 我懷疑在XCode更新期間發生了某種情況。 我通過在我的Mac上手動重新安裝Perl來解決這個問題。 我使用了這里描述的最新版本:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM