あらすじ
Bundler、非常によいツールなんだけど、bundle exec がめんどい。
ググってみたところ gemset
を使う方法 rvmのgemsetを使ってbundlerと賢く付き合う方法 - Hello, world! - s21g と、 bundler-exec.sh
というツールを使う bundle exec を省略する - おもしろWEBサービス開発日記 方法があるみたい。
Windowsでこれを実現したいんだけど、gemsetはちょっと大げさな気がするので、bundler-exec.shを参考にバッチファイルを作成できないかな。
参考サイト
- コマンドのエイリアス設定(DOSKEY)
- whichコマンドを作る
- コマンドプロンプトを使ってみよう! -バッチファイル-
- Windows 2000 コマンドライン徹底活用
- コマンド別/for
- UNIXライクなパス操作をwindowsのcmd.exeのバッチファイルのみで実現
- Windowsのコマンドプロンプトは変態(一部)
調査
ソースを読む限り、やっている処理は
ruby
とかrspec
とかbundle exec hogehogeしたいコマンドにaliasをはる(rubyならbundler-exec.sh rubyとなるように)bundle
コマンドが使えるのか探してみる。使えない場合はそのままコマンドを実行するbundle
が使える場合、今いるパスにGemfile
ファイルがあるのか調べる。ない場合は一つ階層を上がってまたGemfile
があるか探す- 上記をを繰り返す。
Gemfile
がない場合はそのままコマンドを実行する Gemfile
があった場合、bundle exec
を付加してコマンドを実行する
という感じになっている。
ソース
で、作ってみた。
使い方
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がヘボいから?