Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
0
Help us understand the problem. What is going on with this article?
@aosho235

guard-shellで複数ファイルが更新されたとき何回もコマンド実行されないようにする

More than 1 year has passed since last update.

やりたいこと

  • Rubyのguard gemとguard-shellプラグインを使っている
  • プロジェクト内のファイルを監視し、更新されたときプロジェクト全体をビルドしたい
  • 通常、Guardでは1ファイルの更新につきそのファイルを処理するコマンドが1回走るので、touch hoge.c moge.c のように同時に複数のファイルが更新された場合、プロジェクト全体をビルドするコマンドが2回走ってしまう
  • これを1回だけにしたい

解決法

こんな感じでGuardfileを書いておく:

$last_exec_time = Time.now
guard :shell do
  watch(/.*\.(c|h)$/) do |m|
    puts "Changed: #{m[0]}"
    # 前回実行から1秒以内なら実行しない
    if Time.now - $last_exec_time < 1
      puts "Skip"
      next
    end
    ret = `sleep 2; date`  # 実験用のコマンド
    $last_exec_time = Time.now
    ret
  end
end

グローバル変数$last_exec_timeを使い、前回実行から1秒以内ならスキップするようにしている。
ビルドコマンドに1秒以上かかってもちゃんとスキップされている。

やりたいことは非常によくあることな割に、ダーティなやり方である。
もっといい方法があったら教えてください。

[追記]
guard-processguard-rakeを使えば今回のような問題は生じない。
guard-processならGuardfile内にコマンドを書けるので手軽にguard-shellの代用にできる。

そもそもguard-shellは作りがguardの思想から少し外れているような気がする。
watchのブロックは

When you add a block to the watch expression, you can modify the file name that has been detected before sending it to the plugin for processing:
(中略)
NOTE: Normally, most plugins expect the block to return a path or array of paths
https://github.com/guard/guard/wiki/Guardfile-DSL---Configuring-Guard#watch

と書いてある通り、変更されたファイル名から処理すべきファイル名に変換するのが本来の目的であり、その中でシェル呼び出しすればそりゃ複数回呼ばれるよな。

0
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
aosho235
1981年生まれ。駅すぱあとの会社で新規サービスを開発しています。好きなレイヤーはOS~ミドルウェア。好きなことは開発を楽にするためのツールやフレームワークの整備、自分自身が便利と思うものを作ること。新しいものを追うより、自分が自信を持って使える技術で効率的に開発するのが好き。そのため使うライブラリやサービスの挙動は仔細に把握しておきたいものです。
val
経路検索システム「駅すぱあと」をはじめ、全国のデータと高い信頼性をベースにさまざまなサービスを展開。

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
0
Help us understand the problem. What is going on with this article?