カクカクしかじか

技術的なアレコレ

OSSにプルリクエストを送る際の注意点と備忘録

概要

oneshot_task_generatorというgemにプルリクエストを送りました🚀 github.com 本稿はその際についうっかりやらかした部分とどうすると良いのか?を自分なりにメモした記録になります。

oneshot_task_generatorについて

その場限りのスクリプトをrakeタスクとして専用のディレクトリ配下に生成して管理するためのrakeタスクジェネレータです📝
例えば管理画面で実行しづらい処理をスクリプトに書いて、本番で実行しなければならない運用対応などの履歴を管理する際に有用なgemだと思っています。

今回修正した内容

generatorコマンドで生成されるrakeタスクのファイル名とrakeを実行する際に指定するタスク名が微妙に異なるのでその部分を揃えました🔧

修正前

生成されるrakeタスクのファイル名: 20200530_foo_bar.rake

$ bin/rails generate oneshot foo_bar
Running via Spring preloader in process 93693
      create  lib/tasks/oneshot/20200530_foo_bar.rake

実行時のタスク名: foo_bar_20200530

$ bin/rake oneshot:foo_bar_20200530

修正後

生成されるrakeタスクのファイル名: foo_bar_20200530.rake

$ bin/rails generate oneshot foo_bar
Running via Spring preloader in process 93857
      create  lib/tasks/oneshot/foo_bar_20200530.rake

実行時のタスク名: foo_bar_20200530

$ bin/rake oneshot:foo_bar_20200530

今回ダメだった部分

  • ただ単に生成されるファイル名と実行時のタスク名を揃える修正だけをしたこと

rakeタスクの実行時にオプションを追加して既存の名前解決は行えるようにした上で今回の修正を入れるのならば、古いバージョンと挙動を変えずに変えたい人のみ挙動を変えることが出来ます。

しかし、今回はオプションで切り替えるようにしたとかではなく根本的に修正してしまったので破壊的な変更となります。

破壊的な変更を入れると発生する問題

  • 後方互換性がなくなる
  • 後方互換がなくなるということはgemのメジャーバージョンアップを強いるため、軽微な修正のマイナーバージョンとしてマージ出来ないので、メンテナとしてマージしにくい...

後方互換性がないことについては、今回の場合はそもそも既存の生成されるファイル名とタスク名が違う挙動にものすごく違和感があったので、ある程度しょうがないかなと思ってスルーしていました。

しかし、2つ目のメジャーバージョンアップを強いる件は完全に考慮してなかったので、第三者に指摘されてナルホド!となりました😇

ちなみに私は過去にも破壊的な修正をmongoidというgemに対して行ったのですが、無事マージされたので今回もカジュアルに修正プルリクを送ってしまいました...
この辺りは次回以降はちゃんと考えた方が良さそうですね🙈

まとめ

ライブラリに破壊的な変更を入れたい時、例えば今回のようなgeneratorの場合はオプションで挙動を変えられるようにするとマナーが良い🌟 そして、破壊的な変更はライブラリー側にメジャーバージョンアップを強いるので、メンテナの心象的にマージしづらいという事実を理解すること📝

その他

今回参考になったご指摘📝

追記:2020.05/31

無事にマージされました🙏

github.com