redmineのインストール時にバージョン依存でハマる時のヒント

以前にRedmineをインストールしていた頃の手順書を引き継ぎ、久々に作業をしてみたら、見事に入らない。Redmineのバージョン、Rubyのバージョンなどは以前通りにしているにも関わらず、インストール中に

インストールされているモジュールAのバージョンは*.*.*
依存しているモジュールBはモジュールAの <*.*.* を要求している

といった主旨の英語のメッセージが表示されます。これは過去に動いていたバージョンの組み合わせであったも、途中でインストールされている各種モジュールのバージョンが上がり、それにより依存性が崩れてしまうようなのですね。これは公式サイトに掲載されている手順にしても同様ですし、Qiitaなどに掲載されている手順にしても動かないものもあります。

まずは最低限、調べる必要があるのは、
・プラグインを利用する場合は、前提となるRedmineのバージョン(各プラグインの配布サイトなど)
・インストールするRedmineのバージョンと、前提となるRuby、Railsのバージョン(公式サイト)

Rubyのバージョンについては、OSのバージョン、ディストリビューションなどによってはリポジトリからのインストールが難しい事がありますので、結局はソースのtarボールからインストールした方が早い事が多いです。
configureして、make , make install で基本的には完了。
アンインストールする場合は make uninstall でOKです。
ここまでは問題なく進むと思います。

問題は、ここから gem を使って rack や bundler のインストールで、手順としては以下のようなコマンドが紹介されています。

# gem install rack --no-rdoc --no-ri 
# gem install bundler passenger --no-rdoc --no-ri 

この方法だと、どのバージョンが入るか分かりません。後続処理でバージョン依存性でエラーが出た場合には、例えば

# gem install rack -v=1.6.4 --no-rdoc --no-ri

のように、-v オプションを使って、インストールするバージョンを明示することで、回避する事が出来ます。

また Redmine のファイルを展開して、必要なGemパッケージを bundleを使ってインストールする際に、以下のコマンドが紹介されています。

# bundle install --without development test rmagick --path vendor/bundle

ただ、最近では “–without” が deprecated (非推奨)となり

[DEPRECATED] The `--path` flag is deprecated because it relies on being remembered across bundler invocations, which bundler will no longer do in future versions. Instead please use `bundle config set path 'vendor/bundle'`, and stop using this flag
[DEPRECATED] The --binstubs option will be removed in favor of `bundle binstubs`

といった警告メッセージが出てきます。今後のバージョンではremoveされる可能性があるとな。
回避方法はメッセージに表示されている通りで、

# bundle config set path 'vendor/bundle'

としていきます。これを実行すると ~/.bundle/config ファイルが作成され、パスが記述されています。これらを設定してから

# bundle install

を実行してインストールを進めます。

大変だなあとつぶやいてみたら、@y503Unavailable 氏よりコメント頂きました。

そうなんですよ。機能を使うだけでしたら既存のSaaSやbitnamiなどのスタックを使った方が楽ちんです。(bitnamiは自分も以前に使ってみたことがある。大手クラウドプラットフォームには仮想サーバーのテンプレートなども、起動するだけでOK)問題はプラグインの依存バージョンが変わった時に、それに追従できるかですね。(私のケースがこれ)