【エラー】Perl,Amon2構築中エラーとなった話 vol.1-2

## はじめに
下記記事でエラー部分は省いた環境構築の記事を投稿しました。使用したコマンドの数は少なく、当初「これだけでできるんだ、楽勝😊」と思っていましたが、実はエラーが発生しています😢

あくまで私の環境での事なので、同様の事が必ずしも発生するとは限りません。

では実際、どこでどんなエラーが発生していて、どう解決したのかについて共有できればと思います。
下記記事と併せてご参照ください

https://qiita.com/wa-chan222/items/8ca86efb139ce010eca6


##  1：`carton install`でエラー
```terminal
$ cd <プロジェクト名>
$ carton install
Command 'carton' not found, but can be installed with:
sudo apt install carton
```
- `carton`が見つからないらしい
- `cpanm Carton`でインストールした `Carton`が「ホームディレクトリのローカルパス」にインストールされていて「システムの通常のパス」に含まれていないことが原因

### 1-1:`cpanm Carton`コマンド実行時、最後の方にあったメッセージのコマンドを実行する
（人によっては違うかもしれませんが参考までに。）
```terminal
$ cpanm --local-lib=~/perl5 local::lib && eval $(perl -I ~/perl5/lib/perl5/ -Mlocal::lib)
```


<details><summary>上記コマンドの解説</summary>

### 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がモジュールを検索するパスに追加する設定を行います。

### **まとめると**

1. `local::lib` モジュールをローカル（`~/perl5`）にインストールする。
2. ローカルディレクトリ（`~/perl5`）をPerlのライブラリ検索パスに追加して、ローカルのモジュールが正しく認識されるように設定する。

---

### **なぜこのコマンドが必要なのか？**

1. **通常のモジュールインストールでは管理者権限が必要**:
システム全体（`/usr/local/...`）にモジュールをインストールするには管理者権限が必要ですが、このコマンドではローカルディレクトリ（`~/perl5`）を使うため、管理者権限が不要になります。
2. **環境を分離して管理**:
プロジェクトごとに異なるモジュールやバージョンを使いたい場合、ローカルディレクトリを使うと便利です。この方法でシステムに影響を与えずに環境を整備できます。
</details>


### 1-2:再度 `carton install`コマンドで依存モジュールをインストールを試す
```terminal
$ carton install
・
・
Complete!
```

### 1-3:サーバーを起動してみる
```terminal
$ carton exec -- perl -Ilib script/<プロジェクト名>-server
```

- `carton install`でインストールしたモジュールを利用しながら, Perlのスクリプトを動かすには, `carton exec`を利用する
- `amon2-setup.pl`で雛形を生成した際にあった起動用コマンドを使用する


## 2：サーバー起動でエラー
1-3で「よし、これで後はサーバー起動できれば第一段階完了だ」。と思いましたがエラーとなってしまいました😢
```terminal
$ carton exec -- perl -Ilib script/<プロジェクト名>-server
Command 'carton' not found, but can be installed with:
sudo apt install carton
```
- あれ？なんか前回と似たようなエラーだな
- 現在の作業ディレクトリのシェル（ターミナル）で認識されていないことが原因かも

### 2-1:`carton`をターミナルに認識させる
```terminal
・まずシェルが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:再度サーバーを起動させてみる
```terminal
$ 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`モジュールの手動インストール
```terminal
$ 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`のバージョン確認を行う
```terminal
$ cpanm --local-lib=~/perl5 local::lib && eval $(perl -I ~/perl5/lib/perl5/ -Mlocal::lib)

$ carton version
carton v1.0.35 ←バージョンが表示されればOK
```

### 2-5:サーバー起動してみる
```terminal
$ carton exec -- perl -Ilib script/<プロジェクト名>-server
<プロジェクト名>: http://127.0.0.1:5000/
```
- 無事上記URLで画面が表示されました😊


## さいごに
あらためて、エラーがどこで起こったのか、どういうエラーだったのか、どうやって解決したのかについて、詳細にまとめてみました。
なにかご参考になれば幸いです。