2018年以降の記事はGitHub Pagesに移行しました

bundle execを省略したいのでバッチを作った(Windows版)

あらすじ

Bundler、非常によいツールなんだけど、bundle exec がめんどい。

ググってみたところ gemset を使う方法 rvmのgemsetを使ってbundlerと賢く付き合う方法 - Hello, world! - s21g と、 bundler-exec.sh というツールを使う bundle exec を省略する - おもしろWEBサービス開発日記 方法があるみたい。

Windowsでこれを実現したいんだけど、gemsetはちょっと大げさな気がするので、bundler-exec.shを参考にバッチファイルを作成できないかな。

参考サイト

調査

ソースを読む限り、やっている処理は


  1. ruby とか rspec とかbundle exec hogehogeしたいコマンドにaliasをはる(rubyならbundler-exec.sh rubyとなるように)

  2. bundle コマンドが使えるのか探してみる。使えない場合はそのままコマンドを実行する

  3. bundle が使える場合、今いるパスに Gemfile ファイルがあるのか調べる。ない場合は一つ階層を上がってまた Gemfile があるか探す

  4. 上記をを繰り返す。 Gemfile がない場合はそのままコマンドを実行する

  5. Gemfile があった場合、 bundle exec を付加してコマンドを実行する

という感じになっている。

ソース

で、作ってみた。

gosyujin/bundler-exec-bat

使い方

aliasをはる

コマンドプロンプトの場合にはaliasがないようなので、マクロ定義ファイルを作成し、それを起動時に読むようにバッチファイルを作る。または起動オプションを変更する必要があるらしい。(レジストリに登録などでもいい)

定義ファイルは以下のように記述する。とりあえずruby, rspec, herokuを使えるように。必要なコマンドは適宜このファイルに追加する事になる。

heroku=bundler-exec heroku $*
rspec=bundler-exec rspec $*
ruby=bundler-exec ruby $*

定義ファイルを読み込む場合は

> doskey /macrofile=MACRO_FILE

alias(マクロ)を確認するには

> doskey /macros

それ以降

それ以降の処理は bundler-exec.bat に記述している。

バッチファイルをがっつり書く機会もあまりなかったので、結構試行錯誤。(pwdをWindowsで実現させるには? コマンドの実行結果を変数に格納するには? while文ないの? 等々)

とりあえず、動く版を作る事ができた。一応、Documents and Settings下でも実行できたのでパスにスペースが入っていても大丈夫そう。

これをパスが通っているところに放り込み、下記のようなfizzbuzzディレクトリで実行してみる。

C:\fizzbuzz
┣.bundle
┣Gemfile
┣Gemfile.lock
┣fizzbuzz.rb
┣autotest/
┣spec/
┗vendor/
┗bundle
┗ruby
┗1.9.1
┗…

まずは普通に。

$ ruby fizzbuzz.rb 3
bundler is found: bundle exec ruby fizzbuzz.rb 3
Fizz

ちょっと下の階層から実行しても、無事にGemfileを探してbundle exec。

$ cd autotest\
$ ruby ../fizzbuzz.rb 5
bundler is found: bundle exec ruby ../fizzbuzz.rb 5
Buzz

Gemfileを消して Ruby コマンド実行。

$ ls
autotest/ fizzbuzz.rb* spec/
$ ruby fizzbuzz.rb 15
bundler is NOT found or Gemfile is NOT found: ruby fizzbuzz.rb 15
FizzBuzz

ちゃんと bundle exec なしで実行できた!

残件


  • なんか重い

結構力技でやってるから…? またはテストしてるPCがヘボいから?