まとめ
vim じゃなくてもよい。以下では vimdiff を指定しているが、vimdiff 部分を好みの diff ツールに置き換えれば使える。
$ THOR_DIFF=vimdiff bin/rails app:update
# Rails 5 より前
$ THOR_DIFF=vimdiff rake rails:update
イントロ
Rails のバージョンアップ時に bin/rails app:update
を実行して config 周りのファイルをアップデートしますが、対象ファイルがコンフリクトした場合に以下の画面が表示されます。
conflict config/routes.rb
Overwrite /sample_app/config/routes.rb? (enter "h" for help) [Ynaqdh]
この状態で d を押すと差分確認を行うことができますが、このとき diff ツールとしてdiff -u
コマンドが起動されます。差分確認するだけであればこれで十分なのですが、個人的には確認と同時に編集もしたいです。調べたところ diff ツールを指定できるようなので、その方法を載せます。
環境変数THOR_DIFF
を指定する
例えば以下のようにTHOR_DIFF
を指定すると、diff ツールとして vimdiff を使うことができます。
$ THOR_DIFF=vimdiff bin/rails app:update
THOR_DIFF
には別の diff ツールを使用することもできますので、好みのものを指定することができます。
これで bin/rails app:update
時に差分確認しつつ必要な箇所だけのマージもできるので作業効率が上がりました。
THOR_DIFF
はどこから来た?
コンフリクト時にOverwrite /sample_app/config/routes.rb? (enter "h" for help) [Ynaqdh]
と聞いてくるのは実は Thor の機能です。これは Rails のコマンドラインツールに Thor を使っているところがあるためです。
そのため Thor 側のコードを追います。diff ツールを指定している箇所はどうも ここ のようです。同一行に ENV["THOR_DIFF"]
とあるので、環境変数 THOR_DIFF を指定すれば任意の diff ツールを起動できるということを意味しています。ということで THOR_DIFF
は thor のコードから来ています。
RAILS_DIFF というのも見えますが、とりあえずここでは THOR_DIFF を使ってみました。ちなみにどちらもドキュメントには載っていないようなのですが何ででしょうね?