« 自分の能力を超える並行作業は避けよう | トップページ | iBooks が使い物にならない »

2020年6月 8日

RubyGems の gem 作成手順が長いので

皆さんは、programming 言語として何をお使いだろうか。

私は Ruby 使いなので、Ruby 使いの皆さんにお尋ねしたい。「こんな program を作りたい」と思いついてから本格的に program を書き始めるまで、かなり長い手順が要求されている気分にならないだろうか。

多くの Ruby 使いの方は、最初の段階では、1 program につき 1 file を作成していたのではないかと思う。私もそうだ。そもそも、多くの Ruby 本は、1 program につき 1 file という形でほぼ最後まで突き進んでしまう。

そのうち、限界が来る。私が作った Ruby script は、本業のため職場の同僚にも配布したことがある。うろ覚えだが、使い方は口頭で説明した気がする。でも、少々複雑な使い方だったから、ちゃんと説明書を用意して渡してあげるほうが良かった。sample data file も渡したような気がする。

あれ? program file は1つだけなのに、配布物は複数の files だ。こういう場合、配布したての頃は使い方なども記憶に残っているけど、ある程度期間が経つと記憶から消えてしまう。files の版の管理も大変だ。

そういう経験をしてきたので、私は原則としてほぼ全ての Ruby script を、RubyGems を使って書き packaging するようになった (そういや、「君がOpsでもRubyで書いたライブラリはGemで配ろう」という記事もあったが、きっかけは同じなのだろう)。自分しか使わない Ruby script であっても gem 化している。そうすると、install/uninstall する際も便利なのだ。

昔は Gem Cutter とか Jeweler とかが存在していて、どれを使うべきか迷ったが、今では gem 作成に Bundler を利用するのが一般的だ。

ところが… Bundler が生成する .gemspec file の雛形が、かなり使いにくい。具体的に言うと、必須項目ではない選択項目を埋め込んでくるくせに、そこに「TODO」などと書かれていることが多いのだ。「TODO」の記述が残っていると、gem は build できない。なので、最初に TODO 部分を書き換える作業が発生する。そんな作業をやらされると、気分が萎えてくるものだ。

RubyGems 本家の説明書を読むと分かるが、.gemspec file に必須の項目は、たったの5項目しかない。Bundler は、この最低限の5項目以外は最初から comment out しておいてくれればよかったのに。

Bundler が作り出す雛形は、実は RuboCop に通すだけでかなりの警告が出る。頼むから、Ruby community の中である程度方向性が揃うよう、すり合わせをしてくれ。gem 作成の事実上の標準である Bundler で雛形を使ったら、次に coding style の事実上の標準である RuboCop に合わせてごみ取りをしないといけない、という現状は、更に気分を萎えさせる。RuboCop の auto-correct 機能はあまり信頼できないことを知っているが、私は、新規 gem の整形は基本的に auto-correct 機能に任せる方針にした。

RSpec は強力だ。中規模の program であっても、RSpec を使って足元からしっかり動作確認して積み上げていくと、ちゃんと動作するようになる。ただ、spec file をほぼ1から自分で書かないといけない点が辛い。Bundler が生成する spec file には、作成例もほぼないので、自分が実現したい test の書き方を毎回 web 上で調べる羽目になる。こうして spec file を書くのに時間がかかると、気分が萎えてくる。

RSpec を使っていると、coverage 率が気になってくる。そうすると SimpleCov の出番だ。あれ、でもどうやって SimpleCov を組み込むんだっけ? またまた web 上で検索か。気分がどんどん萎えてくる。

program が大きくなってくると document が必要だ。これは、yard が事実上の標準であると言っていいだろう。あれ、でも yard 形式の説明はどう書くんだっけ? またまた web 上で検索か。気分がどんどん萎えてくる。

よし、1つ目の class がある程度書けたから、次は2つ目の class を書き始めよう。えーと、何をやらなくちゃいけないんだったかな…

  • class file を用意して
  • 1行目で string literal を frozen 宣言して
  • module の中に class を入れて
  • methods を用意して
  • class にも methods にも説明文を書いて (あれ、書き方はどうだったかな? またまた web 上で検索か。気分がどんどん萎えてくる)
  • あー、そうだった、spec file も用意して
  • 何だかやるべきことが多いから Rakefile も用意して

という感じで、やるべきことが本当に多い。でも、怠けてこれらの手順を省略すると、後日 (数日後か数年後か) しっぺ返しを食らうことは、経験上分かっている。だから、手を抜くわけにもいかない。

今日、これらの問題をかなり解決する Ruby script を書いた。世間に公表するかどうかは未定。

|

« 自分の能力を超える並行作業は避けよう | トップページ | iBooks が使い物にならない »

コメント

コメントを書く



(ウェブ上には掲載しません)




« 自分の能力を超える並行作業は避けよう | トップページ | iBooks が使い物にならない »