CPANをroot以外のユーザーとして使用するにはどうすればよいですか?


81

ルートアクセス権のない共有サーバーにperlモジュールをインストールしたい。これどうやってするの?彼らはまた古いバージョンのCPANを持っているようです(コマンドを実行するとそれについて不平を言います)、ルートアクセスを必要とせずに私のアカウントから使用されているCPANコマンドを更新することは可能ですか?


回答:


139

私がこれまでに見つけた最も簡単な方法は言うことです

wget -O- http://cpanmin.us | perl - -l ~/perl5 App::cpanminus local::lib
eval `perl -I ~/perl5/lib/perl5 -Mlocal::lib`
echo 'eval `perl -I ~/perl5/lib/perl5 -Mlocal::lib`' >> ~/.profile
echo 'export MANPATH=$HOME/perl5/man:$MANPATH' >> ~/.profile

これは、あなたのプロフィールの名前が想定して.profile、あなたがすることを変更する必要があり.bash_profile.bashrcあなたが言ってモジュールをインストールすることができた後など、

cpanm Module::Name

ルートディレクトリにインストールされている場合と同じように使用します。


以下は、上記のコマンドの機能の簡単な説明です。

wget -O- http://cpanmin.usの最新バージョンをフェッチしてcpanm印刷しSTDOUT、にパイプで送信しperl - -l ~/perl5 App::cpanminus local::libます。最初-perl、プログラムSTDINperl実行されることを期待するように指示しcpanmます。これにより、ダウンロードしたバージョンを実行できます。 perl残りの引数をに渡しますcpanm-l ~/perl5引数が伝えるcpanmところPerlモジュールをインストールすると、他の2つの引数は、インストールするには、2つのモジュールです。 [App::cpanmins] 1はをインストールするパッケージですcpanmlocal::libローカルディレクトリでモジュールを実行するために必要な環境変数を管理するヘルパーモジュールです。

これらのモジュールをインストールした後、実行します

eval `perl -I ~/perl5/lib/perl5 -Mlocal::lib`

ローカルモジュールを使用するために必要な環境変数を設定してから

echo 'eval `perl -I ~/perl5/lib/perl5 -Mlocal::lib`' >> ~/.profile

次回ログインしたときにそれらを使用できるようにするためです。

echo 'export MANPATH=$HOME/perl5/man:$MANPATH' >> ~/.profile

うまくいけば、manがローカルモジュールのmanページを見つけられるようになります。


cpanminusの+1 ...使用したことがないので、お勧めする必要があるとは思えませんが、これまでに見たものから気に入っています
DVK 2010年

7
これは私にとって素晴らしい働きをしてきました。〜/ .profile(またはその他)にすでに存在する既存のPERL5LIB環境変数を最初に削除するためのちょっとしたメモ。そうしないと、最初のコマンドの実行時にlocal :: libのインストールに失敗します。
Juan A. Navarro 2010年

@juannavar良い点ですが、新しくインストールしたマシンにインストールする傾向があるので、そのような場合には遭遇しません。
チャス。オーエンス2010年

curlの代わりにwgetを使用する素晴らしい例-多くのシステムはwgetを備えていますが、デフォルトではcurlを備えていないため、rootを持たないシステムが新しいパッケージをインストールするのに役立ちます。
AndrewPK 2012

1
@HielkeWalinga子プロセスは、親プロセスの環境を変更できません。これに対処するために、親プロセスの環境変数を設定する必要がある、perl -I ~/perl5/lib/perl5 -Mlocal::libまたはのようなコマンド ssh-agentは、親プロセスで実行する必要のあるコマンドを出力してから、evalそれらを出力します。evalただし、実際には必要ありません。と言うこともできますperl -I ~/perl5/lib/perl5 -Mlocal::lib > /tmp/commands; source /tmp/commandsが、evalメソッドの方がクリーンです(クリーンアップするファイルや誤って上書きするファイルはありません)。
チャス。オーエンス

12

http://web.archive.org/web/20120427144232/http://perl.jonallen.info/writing/articles/install-perl-modules-without-root

http://novosial.org/perl/life-with-cpan/non-root/

両方の命令セットの主なステップには、local :: libモジュールが含まれます

AFAIK、CPANロジックはPerlモジュール(CPAN.pm)に含まれています。つまり、他のPerlモジュールと同じように、ローカルディレクトリに新しいロジックを簡単にインストールすることもできます。


また、モジュールを非標準の場所にインストールしたら、非標準の場所からライブラリをロードする際の次の2つの質問を確認してください(情報の一部は上記のリンクですでに利用可能です)。

Perlプログラムは、使用するPerlモジュールを含むファイルの場所をどのようにして知るのですか?

Perlの@INCはどのように構築されますか?(別名、Perlモジュールが検索される場所に影響を与えるすべての方法は何ですか?)


開示-私はこの回答にリンクされているSOの質問の両方を作成しました。
DVK 2010年

2
CPANからモジュールをインストールする方法は少なくとも4つあります。手動、CPANモジュール(およびそれに相当するコマンドラインcpan)、CPANPLUSモジュール(およびそれに相当するコマンドラインcpanp)、およびをインストールする新しいApp :: cpanminusディストリビューションですcpanm。これらの中で、私はcpanmインストールして使用するのが最も簡単だと思います。 cpanそしてcpanpデフォルトでインストールされていますが、正しく動作するために重要なセットアップを必要としています。
チャス。オーエンス

404:要求されたURL / writing / articles / install-perl-modules-without-rootがこのサーバーで見つかりませんでした。
harschware 2015年

6

完全を期すため、これは、のインストールプロセスであるcpanmあなたは維持したい場合はOSX上のperl5下を~/Library

curl -L http://cpanmin.us | perl - -l ~/Library/perl5 App::cpanminus local::lib
eval `perl -I ~/Library/perl5/lib/perl5 -Mlocal::lib=~/Library/perl5`
echo 'eval `perl -I ~/Library/perl5/lib/perl5 -Mlocal::lib=~/Library/perl5`' >> ~/.bash_profile

2

cpanminusがインストールされたモジュールのmanページも読み取れるようにする場合は、選択したライブラリパスの正しいサブディレクトリがMANPATHにあることも確認する必要があります。したがって、cpanmのインストールプロセスを示す上記のソリューションには、次の追加コマンドが必要です。

 export MANPATH=$HOME/Library/perl5/man:$MANPATH' >> ~/.bash_profile

0

過去6か月間、20を超えるデプロイで次の関数を使用てき ました。awsへの自動デプロイが成功しました...メインプロビジョニングから次のように呼び出されます。これは基本的に上記の回答のコピーペーストですが、1回の再使用可能なbashスクリプト:

 #! /usr/bin/env bash                                                                                                                                                     │··  
                                                                                                                                                                           │··
  # a bash wrapper for check-installing required perl modules as non-root  
main(){                                                                                                                                                                  │··
     doSetVars                                                                                                                                                             │··
     doCheckInstallPreReqs                                                                                                                                                 │··
     perl $PRODUCT_INSTANCE_DIR/src/perl/my-perl-script.t                                                                                                                          │··
  }                                                                                                                                                                        │··
                                                                                                                                                                           │··
  doSetVars(){                                                                                                                                                             │··
     #set -x                                                                                                                                                               │··
     umask 022    ;                                                                                                                                                        │··
     set -u -o pipefail                                                                                                                                                    │··
     run_unit_bash_dir=$(perl -e 'use File::Basename; use Cwd "abs_path"; print dirname(abs_path(@ARGV[0]));' -- "$0")                                                     │··
     export PRODUCT_INSTANCE_DIR=$run_unit_bash_dir/../..                                                                                                                  │··
  }                                                                                                                                                                        │··
                                                                                                                                                                           │··
  doCheckInstallPreReqs(){                                                                                                                                                 │··
     eval `perl -I ~/perl5/lib/perl5 -Mlocal::lib`                                                                                                                         │··
     perl -e '                                                                                                                                                             │··
        use JSON ;                                                                                                                                                         │··
        use Data::Printer;                                                                                                                                                 │··
        use Test::Most ;                                                                                                                                                   │··
        use Test::Mojo;                                                                                                                                                    │··
        use Data::Printer ;                                                                                                                                                │··
        use FindBin;                                                                                                                                                       │··
        use JSON::Parse ;                                                                                                                                                  │··
        use IPC::System::Simple ;                                                                                                                                          │··
        use Mojolicious ;                                                                                                                                                  │··
     ' || {                                                                                                                                                                │··
           curl -L http://cpanmin.us | perl - -l ~/perl5 App::cpanminus local::lib                                                                                         │··
           eval `perl -I ~/perl5/lib/perl5 -Mlocal::lib`                                                                                                                   │··
           echo 'eval `perl -I ~/perl5/lib/perl5 -Mlocal::lib`' >> ~/.bashrc                                                                                               │··
           cpanm --local-lib=~/perl5 local::lib && eval $(perl -I ~/perl5/lib/perl5/ -Mlocal::lib)                                                                         │··
           export PERL_MM_USE_DEFAULT=1                                                                                                                                    │··
           cpanm JSON Data::Printer Test::Most Test::Mojo Data::Printer FindBin JSON::Parse \                                                                              │··
              IPC::System::Simple                                                                                                                                          │··
           sudo curl -L cpanmin.us | perl - Mojolicious                                                                                                                    │··
     }                                                                                                                                                                     │··
                                                                                                                                                                           │··
  }                                                                                                                                                                        │··
                                                                                                                                                                           │··
  main
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.