perl のリリースサイクルと perlbrew の共存

perl のリリースサイクルが短くなったこの頃、みなさまいかがお過ごしでしょうか。

リリースサイクル短期化による影響

perlbrew を使ってリリース毎にバージョンを切り替えたりしていると、意外と面倒に感じるのがインストール済みのモジュール類を別バージョンに移行することではないでしょうか?
さらに頻繁にリリースされるとなると、移行するのが面倒ですね。

移行時にやるべき事

移行時には、

  • 既存のバージョンにインストールされているモジュール一覧の抽出
  • 新バージョンのインストール
  • 既存のバージョンにインストールされていたモジュールを新バージョンでインストール

結構手間がかかります。

そこで

こんな bash script を ~/.bashrc などに追記しておくと楽に移行できる tips をお届けします。

ちなみに、最新の perlbrew 0.25 からはエラーが起きた際には exit 1; をよんでいるので、シェルの戻り値で処理を継続するかどうかを判定することができるようになりました(パッチ投げたらマージしてもらえた。やったね!)

function migrate {
    if [ $# -ne 1 ]; then
        cat << EOM
Usage:
    migrate [perl-version]
    migrate perl-5.14.1
EOM

    else
        echo "@@@@@ Start migration to $1"; sleep 1;

        echo "@@@@@ Installing ExtUtils::Installed"; sleep 1;
        cpanm ExtUtils::Installed;

        echo "@@@@@ Extracting all modules"; sleep 1;
        rm /tmp/modules.list;
        perl -MExtUtils::Installed -E 'say for ExtUtils::Installed->new->modules' > /tmp/modules.list;

        echo "@@@@@ Upgrading perlbrew"; sleep 1;
        curl -L http://xrl.us/perlbrewinstall | bash;
        source ~/perl5/perlbrew/etc/bashrc;

        echo "@@@@@ Installing $1"; sleep 1;
        perlbrew install "$1" -v &&

        echo "@@@@@ Switching new environment"; sleep 1;
        perlbrew switch "$1" &&

        echo "@@@@@ Installing cpanminus for new environment"; sleep 1;
        perlbrew install-cpanm &&

        echo "@@@@@ Installing all modules into new environment"; sleep 1;
        cpanm < /tmp/modules.list;

        echo "@@@@@ Re-running cpanminus to check everything is OK"; sleep 1;
        cpanm < /tmp/modules.list;

        echo "@@@@@ Done migration!"
        perl -V;
    fi
}