Bundler環境でIRBでもLSPでもドキュメントを利用する方法

Bundlerでrubygemsをインストールした場合、ドキュメントがない

まぁ deploy 時のことを考えれば実行時間が短縮されていいんだけど、なぜかドキュメントをインストールするためのオプションがないので、ドキュメントが欲しい場合に Bundler だけで対処する方法がない。

何が困るのか

  • ri コマンドでインストール済みの gem のドキュメントを参照できない
  • irb でも同様

irb で補完が効かないのはマジで困る。

対処方法

Bundler には、少なくとも Bundler v2.5 の時点ではドキュメントもインストールするというオプションがない。したがって Bundler 以外の方法で解決が必要。

  1. global に同じ gem をインストール
  2. bundle コマンドでインストールした場所に改めて gem install

1 はさすがにバカバカしい。使わない gem のために容量を2倍消費するし、プロジェクトに入れた gem を網羅し続けられるかどうかは分からない。

じゃあ 2 ということになるが、具体的にどうするのか?

IFS=$'\n'
for g in `bundle list | awk '
/^ +\*/ {
  sub(/\(/, "", $3)
  sub(/\)/, "", $3)
  print $2 " -v " $3
}
'`
do
  echo "gem install $g -i vendor/ruby/3.3.0" | zsh -
done

で、イケる。

  1. awk で gem 名とバージョン番号を抜き出す
  2. その結果を利用してくり返しインストールを実行する
  3. インストール先は gem install の -i オプションで指定する。上記の vendor/ruby/3.3.0bundle install した際のインストール先に各自で書き換えること
  4. $g の展開前にコマンドラインの解釈が終わってしまうらしいので pipe で渡して実行(shell は各自で使っているものに置き換えること)

もうちょっと雑でよければこんな感じ。

bundle list | \
awk '/^ +\*/ { print $2 }' | \
xargs gem install -i vendor/ruby/3.3.0

この場合、Gemfile で指定したバージョンを無視しているので、バージョンが食い違ったり依存関係の解決に失敗する可能性もある。

いずれにせよ、

  • bundler にはドキュメントをインストールするオプションはないが
  • gem には global 以外にも任意の場所にインストールするオプションがある

ことを活かした作戦。

これで

bundle exec irb

環境下でバッチリ補完が効く。当然、

bundle exec ri

でもドキュメントを参照できる。

ついでにSolargraphでの利用方法

Solargraph はソースコードから自前で YARD のドキュメントを生成してそのドキュメントを使うので、上の手順を踏まなくても問題ない。

bundle exec yard gems

でドキュメントを生成できる。ただしこれだけでは language server として利用するには不十分で、

bundle list | awk '/^ +\*/ { print "  - " $2 }

の出力を .solargraph.yml の中の require: の項目に記述する必要がある。

Solargraph: Configuration

準備が整ったら Solargraph を LSP で利用することでグイグイ補完が効くようになる。

More