冬に須磨海岸行った時に撮った一枚。波ガード、防波堤。寒かった。

Railsを使わない環境でGuardを使いたかった

ファイルを保存したら自動で実行。小さなスクリプトであっても、これ無しにコーディングなんて考えられない位便利なツールですよね。

僕は、元々こういった用途では「watchr」というツールがシンプルで気に入って使っていたのだけど、縁あって、より定番ツールであろう「Guard」を触って、同じく定番テストツール「RSpec」で自動テスト環境を構築する事になりました。

ただ、今回はRailsは無しです。
この手のツールの情報を調べると、大体Railsとセットで使う方法が紹介されるページばかりが見つかるんだけど、もうちょっとシンプルな使い方をしたいんだよなぁ……ということで、自分で整理することにしました。

環境はMacでRubyバージョンは2.4.0です。
大した事はしてないので最近のバージョンなら、OSに関わらず同じような方法で行けるでしょう。

Gemコマンドでguardとguard-rspecをインストール

まずは必要な道具を集めます。

$ ruby -v
ruby 2.4.0p0 (2016-12-24 revision 57164) [x86_64-darwin15]

$ gem install guard
Fetching: guard-2.14.1.gem (100%)
Successfully installed guard-2.14.1
1 gem installed

$ gem install guard-rspec
Fetching: guard-rspec-4.7.3.gem (100%)
Successfully installed guard-rspec-4.7.3
1 gem installed

rspec以外でもguardを使いたい場合は適宜必要なプラグインをインストールします。

# こんな感じで検索して……
$ gem search "^guard-"

*** REMOTE GEMS ***

guard-abletonset (0.0.1)
guard-addremove (1.0.1)
guard-annotate (2.3)
.
.
.
# (以下省略、記事執筆時点で300個以上あった。)

# とりあえず応用範囲の広いguard-shellを入れる場合はこんな感じで。
$ gem install guard-shell
Fetching: guard-shell-0.7.1.gem (100%)
Successfully installed guard-shell-0.7.1
1 gem installed

Guardの前にRSpecを準備

以下はこんな感じのファイル構成の環境で行う例です。

project-dir
└── src
    └── code.rb (メインコード)

まずはRSpecの準備を行いましょうか。

# 場所確認
$ pwd
/project-dir

# specファイルの生成
$ rspec --init
  create   .rspec
  create   spec/spec_helper.rb

# ついでに空のspecファイルも用意しておく。
# 後でサンプルで紹介するGuardfileの都合上、
# ファイル名は「[テストしたいファイルの名前]_spec.rb」って感じにします。
$ touch spec/code_spec.rb

specディレクトリとテストコードが準備できました。

project-dir
├── spec
│   └── code_spec.rb (テストコード)
│   └── spec_helper.rb (このディレクトリ内でのテスト設定ファイル)
└── src
    └── code.rb (メインコード)

必要最低限のRSpec設定を書いたGuardfileを用意

そしてGuardfileの生成です。 mpleディレクトリでGuardfileを生成します。 これもRSpec同様(引数にハイフンは付けないけど)initを付けて実行するだけで生成されます。

$ guard init
00:14:00 - INFO - Writing new Guardfile to /project-dir/Guardfile
00:14:00 - INFO - rspec guard added to Guardfile, feel free to edit it
00:14:00 - INFO - shell guard added to Guardfile, feel free to edit it

Guardfileができました。こんな感じになります。

project-dir
├── Guardfile
├── spec
│   └── code_spec.rb
│   └── spec_helper.rb
└── src
    └── code.rb

Guardfileに書いた設定を元に、「guard start」コマンドを実行した時の動きが決まります。

最後に、生成されたGuardfileを開いて編集します。
ファイルを開くと、色々書かれてますが、とりあえず今回はまるごと下記のコードを貼り付けちゃってください。
出来るだけシンプルな記述で動かした方が理解がしやすいはずです。

# guard-rspecプラグインを使用し、条件にあうファイルを監視し、rspecコマンドを実行する
guard "rspec", cmd: "rspec" do
  # srcディレクトリ内のrubyファイルを監視
  watch(%r(src/(.*?).rb)) { |file|
    # specディレクトリ内の対応したファイルを返す
    "spec/#{file[1]}_spec.rb"
  }
end

こうやって、「project-dir」ディレクトリでguard startコマンドを実行します。

# 実際は「guard start」と書かず「guard」だけで実行してもOK
$ guard start
00:14:01 - INFO - Guard::RSpec is running
00:14:01 - INFO - Guard is now watching at '/project-dir'

あとは、「src/code.rb」を保存すると、勝手に「spec/code_spec.rb」がrspecコマンドでテストされはじめます。やったね!

大規模なフレームワーク使うほどでないけど、自動でテストを実行できるのはやっぱり便利です。

たとえばこんな感じで、普段のサイト制作のときなんかにも、guard-sassとかguard-coffeescriptを同時に走らせても便利ですね。
SASSもCoffeeScriptもGuardでまとめて自動コンパイル | webOpixel