Bundler環境でIRBでもLSPでもドキュメントを利用する方法
Bundlerでrubygemsをインストールした場合、ドキュメントがない
まぁ deploy 時のことを考えれば実行時間が短縮されていいんだけど、なぜかドキュメントをインストールするためのオプションがないので、ドキュメントが欲しい場合に Bundler だけで対処する方法がない。
何が困るのか
- ri コマンドでインストール済みの gem のドキュメントを参照できない
- irb でも同様
irb で補完が効かないのはマジで困る。
対処方法
Bundler には、少なくとも Bundler v2.5 の時点ではドキュメントもインストールするというオプションがない。したがって Bundler 以外の方法で解決が必要。
- global に同じ gem をインストール
- 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
で、イケる。
- awk で gem 名とバージョン番号を抜き出す
- その結果を利用してくり返しインストールを実行する
- インストール先は gem install の
-i
オプションで指定する。上記のvendor/ruby/3.3.0
はbundle install
した際のインストール先に各自で書き換えること - $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 を LSP で利用することでグイグイ補完が効くようになる。