CartonとOrePAN2で作るローカルミラー

**下書きの途中で間違って公開してしまったけれど公開。後日、最後の方書き直します。。**

# なにがおいしいの？
イントラネット内など（インターネットに繋がないで）でセットアップから運用まで行わなければならない環境があります。
公開されている便利なPerlのモジュールは大抵、数個から～数十個の依存関係があり、インターネットに接続されていない状態でこれらのモジュールを入れるとなるとそれはもう至難の業だったりします。（apt-getが使えないubuntu or debian、yumが使えないCentOS or fedoraを想像してもらえればいいかと）
そこで、Cartonによって依存関係の解消を行い、さらにOrePANによってcpanのローカルミラーを作成し、それをUSBメモリなどに入れて持って行き、あとはcpanmでローカルミラーを指してインストールしてやれば簡単だよね！というのがここでの”おいしいこと”になります。

# 用意するもの
* イントラネットに接続されたCentOS6（以下開発環境）
* インターネットに接続されたCentOS6（以下本番環境）
* cpanm
* Carton
* local::lib
* OrePAN2
* くじけない心(エラーしてもbuild.logを読む気力)

# local::libのインストール
CartonはシステムにインストールされたPerlから不足しているモジュールの依存関係を解決しようとします。開発環境にlocal::libを入れてシステムのPerlを汚さないようにする必要があります。

```bash
$ curl -L cpanmin.us > cpanm
$ chmod +x cpanm
$ ./cpanm --local-lib=~/perl5 local::lib
$ echo 'eval $(perl -I$HOME/perl5/lib/perl5 -Mlocal::lib)' >> ~/.bashrc
$ source ~/.bashrc
```

※CentOS6のシステムPerlは5.10ですが、この環境ではExtUtils::MakeMaker、Test::More、ExtUtils::MakeMakerが入ってないのでlocal::libだけtarballで持ってきても入りません。standaloneのcpanmで入れることがミソです。

# App::cpanminusのインストール
local::libが入ってしまえば必要なモジュールをどんどん入れます。
Cartonを使うにはcpanmにパスが通っている必要があるのでApp::cpanminusを入れます。

```bash
$ ./cpanm App::cpanminus
$ which cpanm
~/perl5/bin/cpanm
```

# Cartonのインストール

```bash
$ cpanm install Carton
```

# OrePAN2 のインストール
Devel::Coverのテストが通らなかったのでインストールに失敗しましたが、今回は影響がないようなのでテストせずにインストールしてしまいます。

```bash
$ cpanm OrePAN2

Building and testing Devel-Cover-1.10 ... FAIL
! Installing Devel::Cover failed. See /home/kana/.cpanm/work/1397051321.31799/build.log for details. Retry with --force to force install it.
! Installing the dependencies failed: Module 'Devel::Cover' is not installed
! Bailing out the installation for IO-File-AtomicChange-0.05.
! Installing the dependencies failed: Module 'IO::File::AtomicChange' is not installed
! Bailing out the installation for OrePAN2-0.29.
44 distributions installed

=== build.log ===
#   Failed test 'Html_minimal supports launch'
#   at t/internal/launch.t line 21.
#   Failed test 'Html supports launch'
#   at t/internal/launch.t line 21.
# Looks like you failed 2 tests of 9.
t/internal/launch.t .........
Dubious, test returned 2 (wstat 512, 0x200)
Failed 2/9 subtests

```

```bash
$ cpanm --notest Devel::Cover
$ cpanm OrePAN2
```

# Cartonで依存関係解決
本番環境に持って行きたいモジュールをCartonでインストールし、依存関係にあるモジュールを洗い出します。

```bash
$ echo "requires 'Furl';" > cpanfile
$ carton install
$ carton exec -- perl -e 'use Furl;'
$ echo $?
0
```

# ローカルミラーの作成

bundleでtarballをまとめます。

```bash
$ carton bundle
```

indexを作成。これがないとcpanmで一括して入れられません。

```bash
$ orepan2-indexer vendor/cache/
$ ls -l vendor/cache/modules/02packages.details.txt.gz
-rw-r--r-- 1 ymko users 1509  4月 10 00:53 2014 vendor/cache/modules/02packages.details.txt.gz
```

cpanmでローカルミラーを使ってチェック（仮インストール）してみます。
-Lでインストール先を変更しています。
Test::Requires、Test::TCPがないためエラーしてしまいました。

```bash
$ cpanm --mirror-only \
        --mirror=file://`pwd`/vendor/cache \
        -L furl-test \
        Furl

! Installing the dependencies failed: Module 'Test::Requires' is not installed, Module 'Test::TCP' is not installed
! Bailing out the installation for Furl-3.02.
24 distributions installed
```

--notestでテストを行わないようにしてインストールできました。

```bash
$ cpanm --mirror-only \
        --mirror=file://`pwd`/vendor/cache \
        -L furl-test \
        Furl \
        --notest

$ perl -I furl-test/lib/perl5/ -e 'use Furl;'
$ echo $?
0
```

# 持っていくデータをバックアップ
開発環境と本番環境は同じなのでlocal::libでインストールしたものをそのまま持っていくことができます。

```bash
$ tar cfz perl5.tar.gz perl5/
$ tar cfz vendor-index.tar.gz vendor/
```

# 本番環境にdeployする
本番環境の.bashrcにlocal::libのパスを追加
source .bashrcしてやればcpanmが使えます。

```bash
$ tar zxf perl5.tar.gz
$ tar zxf vendor-index.tar.gz
```

# システムPerlにモジュールをインストールする
本番環境ですべてのアプリ、ユーザーがモジュールを使えるように
システムにモジュールをインストールします。

cpanm --sudo でシステムにインストールすることができます。

```bash
$ cpanm --sudo ...
```

# 参考
* [Orepanでローカルミラーを作成・管理する - メメメモモ]
(http://memememomo.hatenablog.com/entry/2013/05/31/143854)
* [OrePANとcpanmでCPANの部分ミラーを作ってCPANモジュールを管理する](http://blog.nomadscafe.jp/2011/02/orepancpanmcpancpan.html)
* [さくらVPS CentOS 6.2 で cpanm と local::lib をインストール – ctrl-x-s](http://fjyuu.info/sakura-vps-cpanm/)
* [社内Cartonコードリーディング会第一回のメモ - $shibayu36->blog;](http://shibayu36.hatenablog.com/entry/2014/04/04/094627)
* [社内Cartonコードリーディング会第二回のメモ - $shibayu36->blog;](http://shibayu36.hatenablog.com/entry/2014/04/09/091405)