読者です 読者をやめる 読者になる 読者になる

rubyのBundlerでgemの雛形作る際の注意事項

ruby
$ bundle gem mygem

とすると、rubygemsの雛形が作れてとても捗るのですが
実行ファイルを配置する場所が、bin から exe に変更されていました。

  spec.bindir        = 'exe'
  spec.executables   = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
$ bundle --version
Bundler version 1.10.6

$ bundle gem mygem
Creating gem 'mygem'...
      create  mygem/Gemfile
      create  mygem/.gitignore
      create  mygem/lib/mygem.rb
      create  mygem/lib/mygem/version.rb
      create  mygem/mygem.gemspec
      create  mygem/Rakefile
      create  mygem/README.md
      create  mygem/bin/console
      create  mygem/bin/setup
      create  mygem/.travis.yml

調べてみると

Bundler: Bundler template moves bins to exe
に記載がありました。
Bundler 1.8 から仕様が変わったようで
要は開発用の実行ファイルを置く場所を bin にして、 公開用を exe にしようぜということらしいです。
このconvensionは Rspec でも取り入れているようでして、上記記事はリンク切れしているので以下を覗いてみると
確かにそうなっています。
rspec-core/rspec-core.gemspec at master · rspec/rspec-core

そして

bundle gem で生成したtemplateでは、 bin以下に console と setup が生成されています。
 
それぞれ、中身を確認すれば一目瞭然ですが
setupは、開発に必要な環境を整える(bundle install)を実行し、 consoleは、必要なものをrequireしてirbを実行しているだけです。
 
ちなみに、setupに記載されている以下は

set -euo pipefail
・「 exit code が 0 じゃなきゃダメ」
・「未知の変数があったらダメ」
・「 pipe でつないだ時に途中の pipe で躓いてもダメ」

だそうです。pipefail 知らんかった。
シェルスクリプトマナー - きつねたぬきだし
 

一応

従来通り、binを使う方法も公式に記載があります。

  spec.executables   = "new_gem"