2012-06-25 36 views
5

tôi thiết lập một dự án ví dụ với cấu trúc sau:Guard thực thi kịch bản shell hai lần

Gemfile 
Guardfile 

Nội dung của những tập tin này là:

# Gemfile 
source :rubygems 
gem "guard" 
gem "guard-shell" 

# Guardfile 
guard 'shell' do 
    watch(/^test\.txt$/) {|m| `echo #{m.inspect} #{File.mtime(m[0])}` } 
end 

Sau đó tôi tiếp tục để chạy guard. Bất cứ khi nào tôi echo một cái gì đó vào tập tin đó, bảo vệ đăng ký một sự thay đổi hai lần. Trong một vỏ:

$ echo blah >> test.txt 

trong bảo vệ vỏ chạy:

> [test.txt] 2012-06-26 00:40:22 +0200 
> [test.txt] 2012-06-26 00:40:22 +0200 

Các hành vi tương tự chiếm vim/nano, vv Điều thú vị là khi tôi chỉ cần chạy echo blah > test.txt, bảo vệ chỉ cháy một lần.

Bất kỳ ý tưởng nào về cách tôi có thể ngăn điều này xảy ra hoặc liệu hành vi này có được mong đợi không?

EDIT: Khai trương lên một vấn đề trên github: https://github.com/guard/guard/issues/297#issuecomment-6586266

Trả lời

5

Có vẻ như một lỗi/tính năng của guard và/hoặc guard-shell. Tôi muốn báo cáo trong vấn đề về github cho nó. Trong thời gian chờ đợi, đây là cách giải quyết (xấu xí) để ngăn các tệp đang chạy nơi số mtime giống như lần trước:

# Guardfile 
class GFilter 
    def self.run(files, &block) 
    @mtimes ||= Hash.new 

    files.each { |f| 
     mtime = File.mtime(f) 
     next if @mtimes[f] == mtime 
     @mtimes[f] = mtime 

     yield f 
    } 
    end 
end 

guard 'shell' do 
    watch(/^test\.txt$/) {|m| GFilter.run(m) { |f| puts "File: #{f}" } } 
end 
+0

Tuyệt vời :) Tôi không chắc liệu tôi có thiếu điều gì hiển nhiên hay không. Cảm ơn vi đa trả lơi! – jabalsad

Các vấn đề liên quan