はじめに
下記記事でエラー部分は省いた環境構築の記事を投稿しました。使用したコマンドの数は少なく、当初「これだけでできるんだ、楽勝😊」と思っていましたが、実はエラーが発生しています😢
あくまで私の環境での事なので、同様の事が必ずしも発生するとは限りません。
では実際、どこでどんなエラーが発生していて、どう解決したのかについて共有できればと思います。
下記記事と併せてご参照ください
1:carton install
でエラー
$ cd <プロジェクト名>
$ carton install
Command 'carton' not found, but can be installed with:
sudo apt install carton
-
carton
が見つからないらしい -
cpanm Carton
でインストールしたCarton
が「ホームディレクトリのローカルパス」にインストールされていて「システムの通常のパス」に含まれていないことが原因
1-1:cpanm Carton
コマンド実行時、最後の方にあったメッセージのコマンドを実行する
(人によっては違うかもしれませんが参考までに。)
$ cpanm --local-lib=~/perl5 local::lib && eval $(perl -I ~/perl5/lib/perl5/ -Mlocal::lib)
上記コマンドの解説
1. cpanm --local-lib=~/perl5 local::lib
-
cpanm
:
Perlのモジュールをインストールするためのコマンド(CPAN Minus)。 -
-local-lib=~/perl5
:
モジュールをシステム全体ではなく、自分のユーザー専用のローカルディレクトリ(~/perl5
)にインストールします。 -
local::lib
:
Perlのモジュールをローカルディレクトリで管理するための仕組みを提供するモジュール。- このコマンドでは、
local::lib
モジュールをローカルにインストールしています。
- このコマンドでは、
2. eval $(perl -I ~/perl5/lib/perl5/ -Mlocal::lib)
-
perl -I ~/perl5/lib/perl5/ -Mlocal::lib
:- ローカルディレクトリ(
~/perl5
)をPerlのライブラリ検索パスに追加します。 -
I
オプションで検索パスを指定。 -
Mlocal::lib
でlocal::lib
をロードします。
- ローカルディレクトリ(
-
eval
:
perl
コマンドの出力を実行して、現在のシェル環境に反映させます。この部分は、ローカルディレクトリにモジュールをインストールした後、そのディレクトリをPerlがモジュールを検索するパスに追加する設定を行います。
まとめると
-
local::lib
モジュールをローカル(~/perl5
)にインストールする。 - ローカルディレクトリ(
~/perl5
)をPerlのライブラリ検索パスに追加して、ローカルのモジュールが正しく認識されるように設定する。
なぜこのコマンドが必要なのか?
-
通常のモジュールインストールでは管理者権限が必要:
システム全体(/usr/local/...
)にモジュールをインストールするには管理者権限が必要ですが、このコマンドではローカルディレクトリ(~/perl5
)を使うため、管理者権限が不要になります。 -
環境を分離して管理:
プロジェクトごとに異なるモジュールやバージョンを使いたい場合、ローカルディレクトリを使うと便利です。この方法でシステムに影響を与えずに環境を整備できます。
1-2:再度 carton install
コマンドで依存モジュールをインストールを試す
$ carton install
・
・
Complete!
1-3:サーバーを起動してみる
$ carton exec -- perl -Ilib script/<プロジェクト名>-server
-
carton install
でインストールしたモジュールを利用しながら, Perlのスクリプトを動かすには,carton exec
を利用する -
amon2-setup.pl
で雛形を生成した際にあった起動用コマンドを使用する
2:サーバー起動でエラー
1-3で「よし、これで後はサーバー起動できれば第一段階完了だ」。と思いましたがエラーとなってしまいました😢
$ carton exec -- perl -Ilib script/<プロジェクト名>-server
Command 'carton' not found, but can be installed with:
sudo apt install carton
- あれ?なんか前回と似たようなエラーだな
- 現在の作業ディレクトリのシェル(ターミナル)で認識されていないことが原因かも
2-1:carton
をターミナルに認識させる
・まずシェルがcartonを認識されているか確認。何も表示されないなら認識していないという事
$ which carton
・cartonがインストールされている場所をシェルに認識させるために、シェルの設定ファイルにそのパスを追加
$ echo 'export PATH=$PATH:/home/hoge/perl5/bin' >> ~/.bashrc
・即座に反映させるためのコマンド実行
$ source ~/.bashrc
・cartonが認識されたか確認
$ which carton
/home/hoge/perl5/bin/carton ←こんな感じのパスが表示されればOK
2-2:再度サーバーを起動させてみる
$ carton exec -- perl -Ilib script/survey-server
Can't locate Carton/CLI.pm in @INC (you may need to install the Carton::CLI module)・・・
- 少しエラーメッセージが変わったけど、エラーである事に変わりはない😢
-
Carton::CLI.pm
というモジュールが@INC
の中に見つからない - つまり必要なモジュールがインストールされていないというエラー
2-3:Carton::CLI.pm
モジュールの手動インストール
$ cpanm Carton::CLI
!
! Can't write to /usr/local/share/perl/5.34.0 and /usr/local/bin: Installing modules to /home/hoge/perl5
! To turn off this warning, you have to do one of the following:
! - run me as a root or with --sudo option (to install to /usr/local/share/perl/5.34.0 and /usr/local/bin)
! - Configure local::lib in your existing shell to set PERL_MM_OPT etc.
! - Install local::lib by running the following commands
!
! cpanm --local-lib=~/perl5 local::lib && eval $(perl -I ~/perl5/lib/perl5/ -Mlocal::lib)
!
Carton::CLI is up to date. (undef)
- メッセージを読み解くと「ユーザーのローカル環境(~/perl5)にインストール」されたそうなので、これで大丈夫か❓
2-4:メッセージ中のコマンドとcarton
のバージョン確認を行う
$ cpanm --local-lib=~/perl5 local::lib && eval $(perl -I ~/perl5/lib/perl5/ -Mlocal::lib)
$ carton version
carton v1.0.35 ←バージョンが表示されればOK
2-5:サーバー起動してみる
$ carton exec -- perl -Ilib script/<プロジェクト名>-server
<プロジェクト名>: http://127.0.0.1:5000/
- 無事上記URLで画面が表示されました😊
さいごに
あらためて、エラーがどこで起こったのか、どういうエラーだったのか、どうやって解決したのかについて、詳細にまとめてみました。
なにかご参考になれば幸いです。