22

これまでのところ、システム perl (Ubuntu 10.10 上) を使用しており、local::lib を使用して CPAN モジュールをプライベート ディレクトリ ~/perl5 にインストールしていました。

私は perlbrew を使おうとしているので、彼らはお互いを知らないようです。perlbrew を使用して perl-5.12.3 をインストールしましたが、perlbrew use perl-5.12.3 を使用して切り替えると、local::lib によって設定された PERL5LIB と PERL_MM_OPT が表示されます。

それは良いことではありません:

$ cpan XML::Simple
/home/gabor/perl5/perlbrew/perls/perl-5.12.3/bin/perl: symbol lookup error: /home/gabor/perl5/lib/perl5/x86_64-linux-gnu-thread-multi/auto/Cwd/Cwd.so: undefined symbol: Perl_Gthr_key_ptr

その間

$ which cpan
/home/gabor/perl5/perlbrew/perls/perl-5.12.3/bin/cpan

したがって、正しいバージョンの cpan クライアントを使用していますが、PERL5LIB 環境変数が原因で、間違った場所からモジュールを取得します。

perlbrew にはいくつかの互換モードがありますか、それとも PERL5LIB と PERL_MM_OPT を手動でオフにする必要がありますか?

4

5 に答える 5

17

perlbrew を使い始めて以来、シェルの使用に local::lib を使用するのをやめました。なぜなら、私は自分の perl を持っているので、すべてに書き込み権限があるため、site_perl にインストールするだけではるかに簡単になり、異なるバージョンを使用できるようになります各 perl のモジュール数。

私はまだ local::lib (より具体的には、local::lib ディレクトリを自動的に設定する cpanm の -l または -L オプション) を使用して、アプリケーション固有の依存関係をアプリケーション ディレクトリ内に保持しています。

于 2011-03-28T02:57:33.013 に答える
11

local::libは、同時にインストールされた複数のバージョンの Perl で動作するようには設計されていません。通常、Pure-Perl モジュールは問題になりませんが、XS モジュールはメジャー リリース間で互換性がありません。

純粋な Perl モジュールには引き続き local::lib を使用できます (したがって、作成した Perl のすべてのバージョンにそれらをインストールする必要はありませんが、XS モジュールはperlbrewで作成されたディレクトリにインストールする必要があります。 PERL5LIB をクリアする必要はありません (XS モジュールには純粋な Perl の依存関係がそこにインストールされている可能性があるため、クリアする必要はありません)。しかし、PERL_MB_OPTXSPERL_MM_OPTモジュールをインストールする際には、それらが local::lib ディレクトリにインストールされないようにクリアする必要があります。 .

システム Perl の XS モジュールに local::lib を引き続き使用する必要がある場合は、そのための 2 つ目の local::lib 環境を作成することをお勧めします (おそらく~/perl5sys. perlbrew を使用してシステム Perl と同じバージョンの Perl のコピーをインストールし、システム Perl の代わりにそれを使用する方が簡単な場合があります。

/home/gabor/perl5/lib/perl5/x86_64-linux-gnu-thread-multiディレクトリを削除することで、既存の local::lib 内の XS モジュールを消去できます。

于 2011-03-27T07:53:29.700 に答える
6

可能ですが、快適ではありません。これが単一ユーザーのセットアップである場合は、モジュールを使用local::libせずに perlbrew にモジュールを管理させたほうがよいかもしれません。また、全員が同じマシンと OS を持っている均質なネットワーク上のマルチユーザー設定の場合、PERLBREW_ROOTeg に設定するだけ/net/share/perlbrewで、インストールされた perl (およびそのモジュール) を共有できます。他の回答で述べたように、マシンを混在させようとすると、これは問題になります (また、異なるオペレーティング システムを使用している場合にも問題になる可能性があります)。

非常に多様なネットワークでは、すべてを分離することを好みます。local::lib現在の perl と現在のプラットフォームの関数になるようにセットアップするだけです。

distro=lsb_release -d|cut -f2|tr ' ' '-'
arch=`uname -m`
platform="$distro-$arch"

export PERLBREW_ROOT=/net/share/perlbrew/$platform
# You will have to first do 'perlbrew init' (just once for all users)
# In this case you don't need (and shouldn't have) a ~/.perlbrew
source $PERLBREW_ROOT/etc/bashrc

perl5base=/net/share/perl
# When $PERLBREW_PERL is not defined, local::lib puts modules in $perl5base/$platform
perl5=$perl5base/$platform/$PERLBREW_PERL

# We also found that we needed to clean PERL5LIB in between
export PERL5LIB=`echo -n $PERL5LIB|sed "s|${perl5base}[^:]*||g"`
export PATH=`echo -n $PATH|sed "s|${perl5base}[^:]*||g"`

# Setup local lib, relative to the perl being used
lib=$perl5/lib/perl5
mkdir -p $lib
eval $(perl -I"$lib" -Mlocal::lib="$perl5")

これは正確なスクリプトではありません。特に、最初にこれらのディレクトリがすべて存在することを確認する必要があります。プラットフォームごとに perlbrew init を 1 回実行する必要があり、毎回 local::lib もブートストラップする必要があります。

このアプローチはお勧めしませんが、これを機能させる 1 つの方法の例として提供します。これは、混合ネットワーク (Mac OS でも) で機能します。local::lib を省略して perlbrew (システム perl を無視) だけを使用すると、よりクリーンなアプローチになります。

于 2011-05-17T20:57:56.280 に答える
3

宮川さんが言っていたように、Perlbrew でインストールした Perls だけを使うのであれば local::lib を使う必要はないかもしれません。

しかし、作成した Perl とシステム Perl の間を行き来できるようにしたい場合は、このためのPerlswitcherというスクリプトがあります。きれいではありませんが、機能します。必要なのは、スクリプトをダウンロードすることだけです。名前を付けて保存し~/perl5/userperls/bashrc、ソースにすることができます。

2 つのコマンドを提供します。perlswitchPerlbrew によってインストールされた Perl またはシステム Perl に切り替えることができます。perlinfoどの Perl が現在使用されているかを示します。を使用するcpanmと、システム Perl を使用している場合はパッケージをローカル ライブラリにインストールし、カスタム Perl を使用している場合はサイト Perl に直接インストールします。

を使用してカスタム Perl に切り替えた後perlswitchperlbrew listは使用されている Perl も認識します。

$ perlswitch perl-5.18.4
Setting new perl /var/www/perl5/perlbrew/perls/perl-5.18.4/bin/perl...
Using user perl (site_perl) instead of local::lib
$ perlbrew list
  perl-5.16.3
* perl-5.18.4
  perl-5.20.2
于 2015-11-14T16:41:31.650 に答える