web-dev-qa-db-ja.com

CPANはどこにモジュールをインストールしますか?

CPANがファイルをインストールする場所についての信頼できる/包括的な説明が見つかりません。一連のルールが必要であり、「XYZディレクトリ」ほど単純ではないと思います。たとえば、Perlが1つしかインストールされていなくても、Linuxボックスで複数のユーザーがCPANを実行できるため、なんとかして機能します。それで、それらのルールは何ですか?

この質問の2番目の部分:Perl5LIB環境変数のドキュメントには、「標準ライブラリと現在のディレクトリを探す前にPerlライブラリファイルを探すディレクトリのリスト」と記載されています。

CPANは標準ライブラリの場所にはインストールされないと思います。これはおそらく特定のPerlバージョンで修正されているためです。 CPANはPerl5LIBにインストールされるのでしょうか?

そして最後に、すでに述べたように、CPANは複数のユーザーが同じPerlインストールを実行している可能性があるという事実をどのように処理しますか?別の質問の場合は申し訳ありませんが、おそらく関連しているようです。

9
Stephen

Perlは3セットのインストール場所を指定します。

  • Perl、Perl自体に含まれるモジュール用。
  • vendorPerlバイナリのプロバイダーによってインストールされたモジュールの場合。
  • sitecpanを使用してインストールされたモジュールの場合。

これらの各セットは、多くのファイルタイプのインストール場所を提供します。

                        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にモジュールの場所を知らせることができます。


  1. CPANはモジュールをインストールしません。リポジトリです。

    cpanはモジュールをインストールしません。 cpan CPANからディストリビューションをダウンロードし、提供されているインストーラーを実行しますMakefile.PLおよびBuild.PL。 (cpanmcpanpも同じです。)

    これらのスクリプトは主に ExtUtils :: MakeMaker または Module :: Build を使用してインストールします(他のインストーラーが存在します)。

10
ikegami

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」は古くなっています:.は、セキュリティ上の理由から、モジュールの場所のデフォルトリストから削除されました。

4
melpomene

これは複雑な質問です。 coreライブラリがどこにあるのかを探すことで、それらがどこにあるかを知ることができます:

perldoc -l B

Bコアモジュールの場所を教えてくれます。そして、あなたは異なる結果で他の人を試すかもしれません...

また、Perl -Vは、ライブラリを検索する場所である@INCの値とともに、重要なすべてのシェル変数を通知します。

Coreライブラリは通常、localライブラリとは異なる場所にあります。また、perlbrewlocal::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>で呼び出されます。失敗することはありません...

0
Javier Elices