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

Tags: [ Ruby ] [ Bundle ] [ Windows ] Published: 2012/10/01

あらすじ

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

blog comments powered by Disqus

Author: kk_Ataka / Powered by Jekyll on GitHub Pages