オフラインでCPANを使う方法 (2種類)

CPANに接続できなくてもCPANモジュールをインストールする方法を2つ説明。
次のケースで便利。

* 外部から隔離されたサーバー
* 山奥や飛行機の上など、ネットにつながらないとき。

手段は2種類。

* CPAN::Miniを使ってCPANミラーを作る (オススメ)

    CPANにあるものなら何でもインストールできる。
    簡単。依存関係に悩まされない。
    ストレージの容量が必要。(2013年3月時点では2.4G必要)

* cpanのキャッシュを利用する

    一つ目に比べて必要最低限の容量ですむ。持ち運びしやすい。
    依存関係ではまる場合もある。

これらの方法は、既にネットにたくさん書かれていますが、自習、確認のためにも投稿。

# CPAN::Miniを使ってCPANミラーを作る

流れとして、CPAN::Miniをインストール、CPANミラーを作成、cpanのダウンロード先にローカルのミラーを追加。以上。

##実行例

```shell:ミラー作成
$ cpanm CPAN::Mini
$ minicpan -r http://ftp.kddilab.jp/lang/CPAN/ -l /home/user/minicpan
```

ミラーを作れば、あとは煮るなり焼くなり自由。

* コピーを持ち歩く
* NFS経由でアクセスする
* ローカルのhttp,ftpで取得

cpanの向き先はしっかり設定する

```shell:cpanの取得先をミラーにする
$ cpan
[cpan] > o conf unshift file:///home/user/minicpan
[cpan] > o conf commit
[cpan] > quit
$ cpanm (Installしたいモジュール)
```

cpanmでインストールしたい場合、--mirror指定が必要です。

```shell:cpanmで使う場合
$ cpanm --mirror /home/user/minicpan (モジュール名)
```


##定期的にミラー

CPANミラーを常に最新に保つならcronで、定期的にミラー。

```shell:cron設定
$ crontab -e
# 毎日朝5時にミラーリング
0 5 * * * minicpan -qq -r http://ftp/kddilab.jp/lang/CAPN/ -l /home/user/minicpan
```


##注意点

* **ミラー先はhttp**一択。ftpは接続拒否される可能性が高い。(kddilabは拒否された)
* ミラー先は[CPAN.orgのmirror](http://search.cpan.org/mirror)から近い場所を選ぶ。
* perlbrewで複数のperlを使い分けている場合、minicpanのcronが失敗する場合もある。


##参考サイト

* [CPAN CPAN::Min](http://search.cpan.org/~rjbs/CPAN-Mini-1.111011/)
* CPAN::Miniで[ググる](https://www.google.co.jp/search?q=CPAN%3A%3Amini)と先人の記録がたくさんあります。





#cpanのキャッシュを使う

これは、cpanでインストールする場合、モジュールのアーカイブを~/.cpan/sourcesにダウンロードする特性を利用した方法です。
**依存関係にはまらない**ために、perlbrewを使います。

作業の流れは、

1. perlbrewをインストール
2. perlbrewで、オフラインサーバーのperlと同じバージョンをインストール
3. cpanで必要なモジュールをmake
4. ~/.cpan/sourceをアーカイブ
5. インストールしたいサーバーの~/.cpan/sourceにアーカイブを展開
6. cpanのurllistに~/.cpan/sourceを追加
7. モジュールのインストール

perlbrewを使うのは、perlを白紙の状態にして、依存モジュールをもれなくダウンロードさせるためです。

##作業例

まず、CPANにつながるサーバー、マシンで作業する。

```shell:perlbrewのインストール
$ curl -L http://xrl.us/perlbrewinstall | bash
$ cat >>~/.bashrc_profile
source $HOME/perl5/perlbrew/etc/bashrc
$ source $HOME/perl5/perlbrew/etc/bashrc
$ perlbrew self-upgrade
```

```shell:perlのインストール、切り替え
$ perlbrew available
$ perlbrew install perl-5.14.4      # ここでは、perl 5.14にインストールしたいという設定
(インストール作業実行)
$ perlbrew switch perl-5.14.4
```

~/.cpan/CPAN/MyConfig.pmで、```build_cache => q[10]```と少ない場合、100に変更する。(モジュールの数が多いなら、さらに増やす)

```shell:cpanでモジュールのダウンロード
$ cpan
[cpan] > make (モジュール)     # 必要なモジュールをmakeする。
                               # たまに聞かれる依存モジュールのmakeもyesと答える。
[cpan] > quit
$ cd ~/.cpan/sources
$ tar czf cpan_sources.tar.gz *        # sources以下のファイルをアーカイブ
```

これで~/.cpan/source以下に、モジュールのアーカイブが保存されています。
これをアーカイブし、使いたいサーバーにコピー。

```shell:sourceに展開
$ cd ~/.cpan
$ mv sources sources.org                   # 既にsourcesがある場合、一時退避。
$ mkdir sources
$ cd sources
$ tar zxf ~/cpan_source.tar.gz ./

次に、インストール先のcpanを次のように設定。

```shell:cpan設定
$ cpan
[cpan]> o conf urlist unshift ~/.cpan/sources
[cpan]> o conf commit
```

これで、モジュールの使用先、1番目が~/.cpan/sourcesになります。
以後、通常のcpanと同じように、(あらかじめ選んだ)モジュールがオフラインでもインストール可能になります。

```shell:cpanで普通にインストール
[cpan] > install (モジュール名)
```

cpanmでインストールしたい場合、--mirror指定が必要です。

```shell:cpanmで使う場合
$ cpanm --mirror ~/.cpan/sources (モジュール名)
```

##注意点

* ~/.cpan/CPAN/MyConfig.pmのbuild_cacheの値は100かそれ以上の値にする。(少ないと、モジュールのアーカイブが削除されてしまう)
* 依存関係ではまる場合があるので、予行演習は十分に。