2020-01-07

git-srcを使ってOSSの開発に参加しよう

みなさんRubyで開発していると様々なgemを使うと思うのですが、時にgemの不具合に出会ったり、このgemにこんな機能があったら良いのにということを思うことがあるでしょう。 そんな時にはそのgemのソースコードを修正したりするかと思います。修正したコードはどうしていますか?

自分(またはオーガニゼーション)のリポジトリのフォークにブランチを切ってパッチを当てて… なんてしていませんか?

もちろん、自身のプロダクトでとりあえずそのパッチを使いたいという場合はそれでよいでしょう。 でも、そのあと対象のgemもバージョンが上ったりするたびにパッチを適用したりメンテナンスが大変です。

そうです!アップストリームにpull requestを投げますよね!
今日はここまでの一連の流れをgit-srcをつかってどうやるかということを書きたいと思います。

まずは、git-srcのインストールです。
みなさん当然rbenvを使ってRubyをインストールしていると思います。git-srcはrbenvのプラグインですのでrbenvのインストールされているディレクトリにインストールします。

$ git clone https://github.com/amatsuda/gem-src.git "$(rbenv root)/plugins/gem-src"

次にgemのソースコードの置き場所を作って、設定ファイル(~/.gemrc)にそのディレクトリを指定します。 gem-srcのREADMEには~/srcを推奨していますが、私はgem以外のソースコードも~/srcディレクトリに置いているので~/src/gemsにしています。

$ mkdir ~/src/gems
$ echo "gemsrc_clone_root: ~/src/gems" >> ~/.gemrc

これで準備は完了!gem install hogeとかbundle installする度に~/src/gemsディレクトリにgemのソースコードが放りこまれます。

$ gem install opal

~/src/gems/opalにopalのソースコードがgit cloneされています。 opalのソースコードに修正を加えたい場合はおもむろにそのディレクトリで

$ hub fork

というコマンドを打ちます。
おっと、説明を忘れていました。みなさんはもちろんGitHubを使っていてhubコマンドがインストールされていますよね?

これであなたのGitHubリポジトリにフォークがつくられました。
opalの不具合を修正したり、新しい機能を追加したりするパッチを書きましょう。

ここでちょっと注意が必要です。このlocalリポジトリのHEADはmasterでお使いのopalのバージョンのタグをチェックアウトしておく必要があります。

修正版のopalを使うにはGemfileに次のように書いておきます。

gem 'opal', path: '~/src/gems/opal'

こうすることでbundlerは修正版のソースコードからファイルをロードしてくれるようになります。

パッチが出来上がったら、プロダクトもこのパッチを適用したバージョンを使いたくなりますよね。
自分(またはオーガニゼーション)のリポジトリにpushしてGemfileを書き換えます。

gem 'opal', github: 'https://github.com/youchan/opal' # youchanのところは適宜書き換えてください。

最後はアップストリームにpull requestを送って完了です。 アップストリームでパッチがマージされて、gemの新しいバージョンが使えるようになったらGemfileを戻してやればOKです。

Rubyはオープンソースでの開発が出来る仕組みが普通にあって、自然とオープンなエコシステムの中で開発できる素敵な環境です。
仕事で書くコードもオープンソースのコードもシームレスに開発してOSS開発を楽しんでいきましょうね!