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がヘボいから?

関連記事(この記事の初版より古い記事はリンクがグレーで表示されます)

  1. 2012/07/17 [Ruby] [Windows] [Redmine] Windows版Redmineをサービスに登録してブート時に起動させる(宿題あり)
  2. 2012/04/20 [Ruby] [Windows] ZenTestで実行したRSpecの結果をGrowlで通知してくれるようにした
  3. 2012/03/27 [Windows] [Jenkins] [Ruby] simplecovとsimplecov-rcovを使ってJenkinsでカバレッジを確認
  4. 2012/03/20 [Windows] [Jenkins] [Ruby] Windows環境用にrcovをビルドしなおす手順
  5. 2012/02/29 [Ruby] [Rails] [Windows] Rails3レシピブックを読みながらRailsを学ぶ モデル、コントローラ、ビュー、Railsの規約など
  6. 2012/02/28 [Ruby] [Windows] [Rails] Rails3レシピブックを読みながらRailsを学ぶ
  7. 2012/02/20 [Ruby] [Windows] Rubyの実行ファイルを作成するExerbとOcraを試してみた
  8. 2011/09/30 [Java] [Windows] [Ruby] .msgファイルをパースして中から添付ファイルを抜き出す
  9. 2011/09/07 [Ruby] [Redmine] [SQLite3] [Windows] Redmineのプラグイン作成のための備忘録と、時々SQLite3
  10. 2011/08/23 [Ruby] [Windows] MicrosoftOutlookで消せなくなったフォルダをwin32ole経由でRubyから消してみる
  11. 2011/07/09 [Windows] [Ruby] MicrosoftOutlookのメールをRuby(win32ole)で操作する! その2
  12. 2011/05/17 [Ruby] [Windows] MicrosoftOutlookのメールをRubyで操作する!
  13. 2011/05/01 [Ruby] [Redmine] [Windows] Redmineインストール備忘録(Windows)
  14. 2012/12/25 [Ruby] メモ化を知った
  15. 2012/11/12 [Ruby] [Jekyll] はてなダイアリーのエントリをJekyllへ移行する