CPANがファイルをインストールする場所についての信頼できる/包括的な説明が見つかりません。一連のルールが必要であり、「XYZディレクトリ」ほど単純ではないと思います。たとえば、Perlが1つしかインストールされていなくても、Linuxボックスで複数のユーザーがCPANを実行できるため、なんとかして機能します。それで、それらのルールは何ですか?
この質問の2番目の部分:Perl5LIB環境変数のドキュメントには、「標準ライブラリと現在のディレクトリを探す前にPerlライブラリファイルを探すディレクトリのリスト」と記載されています。
CPANは標準ライブラリの場所にはインストールされないと思います。これはおそらく特定のPerlバージョンで修正されているためです。 CPANはPerl5LIBにインストールされるのでしょうか?
そして最後に、すでに述べたように、CPANは複数のユーザーが同じPerlインストールを実行している可能性があるという事実をどのように処理しますか?別の質問の場合は申し訳ありませんが、おそらく関連しているようです。
Perlは3セットのインストール場所を指定します。
Perl
、Perl自体に含まれるモジュール用。vendor
、Perl
バイナリのプロバイダーによってインストールされたモジュールの場合。site
、cpan
を使用してインストールされたモジュールの場合。これらの各セットは、多くのファイルタイプのインストール場所を提供します。
Installation location
--------------------------------------------------------
Type of file Perl vendor site
---------------------- --------------- --------------------- -------------------
Build-specific modules installarchlib installvendorarch installsitearch
Modules installprivlib installvendorlib installsitelib
Binary programs installbin installvendorbin installsitebin
Other programs installscript installvendorscript installsitescript
man pages for scripts installman1dir installvendorman1dir installsiteman1dir
man pages for modules installman3dir installvendorman3dir installsiteman3dir
html docs for scripts installhtml1dir installvendorhtml1dir installsitehtml1dir
html docs for modules installhtml3dir installvendorhtml3dir installsitehtml3dir
これらの場所のパスは、次を使用して取得できます。
Perl -V:{var}
以下を使用して、これらの場所のすべてのパスを取得できます。
Perl -V:'install.*'
これらはインストーラーが使用するデフォルトです[1]。ただし、最も一般的に使用される2つのインストーラーを使用すると、インストールを実行するユーザーは、これらのすべてを上書きできます。モジュールが標準以外の場所にインストールされている場合、Perl5LIB
を使用して、Perl
にモジュールの場所を知らせることができます。
CPANはモジュールをインストールしません。リポジトリです。
cpan
はモジュールをインストールしません。 cpan
CPANからディストリビューションをダウンロードし、提供されているインストーラーを実行しますMakefile.PL
およびBuild.PL
。 (cpanm
とcpanp
も同じです。)
これらのスクリプトは主に ExtUtils :: MakeMaker または Module :: Build を使用してインストールします(他のインストーラーが存在します)。
CPANは実際にはファイルをインストールしません。各ディストリビューションに埋め込まれたインストールスクリプトを実行し、実際のインストールを実行します。
ExtUtils :: MakeMaker を使用するディストリビューションの場合、デフォルトはここに記載されています: https://metacpan.org/pod/ExtUtils::MakeMaker#make-install (およびデフォルトINSTALLDIRS
の値はsite
です)。 Module :: Build については、 https://metacpan.org/pod/Module::Build#INSTALL-PATHS を参照してください。
ドキュメントが$Config{foo}
または%Config
について語っている場合、それは Configモジュール によって提供される%Config
変数を意味します。 $Config{foo}
の値は、Perl -V:foo
を実行して検査することもできます。
(これが不必要に複雑に思われる場合、あなたは正しいです。)
短いバージョンでは、Perlには複数の「システムディレクトリ」があり、そのうちの1つは「サイト固有の」モジュール用であり、デフォルトのインストールターゲットとして使用されます。これは(Perlのインストールごとに)単一のディレクトリであり、マルチユーザーシステムとうまく適合しないことは正しいです。すべてのユーザー間で共有され、モジュールをインストールするにはroot権限が必要です(そうすると、アップグレード/システムパッケージのモジュールをオーバーライドすることはお勧めできません)。
人々が代わりに行うことは、ExtUtils :: MakeMaker、Module :: Buildなどを構成して、ユーザーのホームディレクトリにインストールすることです。これは、環境変数を使用して行うことができます。次に、Perlにこのディレクトリを@INC
に追加するように指示します。これにより、モジュールを実際に見つけてロードすることができます。これは、別の環境変数Perl5LIB
で行われます。 (Perl5LIB
はインストールには影響せず、純粋にロードに使用されます。)
上記はすべて自動化され、 local :: lib にカプセル化されます。 (local :: libは、プロジェクトごとのモジュールサブディレクトリの作成などにも使用できます。)
CPANのドキュメントには次のようにも書かれています。
CPAN 1.9463以降、デフォルトのPerlライブラリディレクトリを書き込む権限がない場合、CPANの設定プロセスでは、bootstrap
local::lib
を実行するかどうか尋ねられます。 Perlライブラリディレクトリは簡単です。
プライベートPerlをホームディレクトリにインストールすることで、問題全体を回避できます(この場合、「system」ディレクトリは$HOME
の下のサブディレクトリにすぎないため、誰とも共有せず、自分で書き込むことができます)。これは非常に簡単です。 perlbrew 。
別のメモ:Perl5LIB
のドキュメントでバグを発見しました。 「and the current directory」は古くなっています:.
は、セキュリティ上の理由から、モジュールの場所のデフォルトリストから削除されました。
これは複雑な質問です。 coreライブラリがどこにあるのかを探すことで、それらがどこにあるかを知ることができます:
perldoc -l B
B
コアモジュールの場所を教えてくれます。そして、あなたは異なる結果で他の人を試すかもしれません...
また、Perl -V
は、ライブラリを検索する場所である@INC
の値とともに、重要なすべてのシェル変数を通知します。
Coreライブラリは通常、localライブラリとは異なる場所にあります。また、perlbrewとlocal::lib
を使用している場合は、さらに考慮すべきことがあるかもしれません。シェル変数に関しては、Perl5LIB
とともに、Perl_LOCAL_LIB_ROOT
もあります。
他の質問については、root
はシステム全体にライブラリをインストールする可能性があると思います。すべてのユーザーは、それらのローカルプレースを、シェル変数またはコマンドラインオプションPerl -I <lib location>
などの他の手段によって、またはuse lib <lib location>;
のようなコード内に含めます。
perlbrew もあり、local::lib
を使用すると、権限のないユーザーがローカルにPerlおよびライブラリをインストールできますディレクトリ。
CPANからモジュールをインストールする方法に関して、私のお気に入りは cpanminus です。 cpanm <library to install>
で呼び出されます。失敗することはありません...