我正在尝试使用listen gem(https://github.com/guard/listen)来监听特定文件,但到目前为止只能获得正确监听整个目录的基本功能。
以下是我正在尝试的一个例子:
require "listen"
module FileTracker
filedir = "/home/user/dir"
filenames = [ "file1", "file2" ]
# Should only track 'file1' and 'file2' in this directory
listener = Listen.to(filedir, only: filenames) do |modified, added, removed|
puts "Updated: " + modified.first
end
listener.start
sleep
end
我还尝试过将单个文件名指定为only:
参数的字符串,但这也不起作用。
我的最终目标是能够在各种目录中跟踪用户定义文件的列表以进行更改。我只想跟踪每个特定文件,而不是整个目录。
答案 0 :(得分:4)
我没注意到我在这里做的事情。 only:
显然需要一个正则表达式,我显然没有构建和提供。希望这可以帮助其他可能需要使用listen
来监视或忽略特定文件的人。
以下是我工作解决方案的一个示例:
module FileTracker
filedir = "/home/user/dir"
filenames = [ "file1", "file2" ]
listenRegex = filenames.join("$|").gsub!(".", "\.") + "$"
# Should only track 'file1' and 'file2' in this directory
listener = Listen.to(filedir, only: /#{listenRegex}/) do |modified, added, removed|
puts "Updated: " + modified.first
end
listener.start
sleep
end
答案 1 :(得分:1)
您可能会发现一些有用的提示:
正确引用正则表达式并使用正则表达式组而不捕获它们:
filenames = %w(foo.txt bar.js)
listen_regex = /(?:#{file.map { |f| Regexp.quote(f) } * '|'})$
(应该更可靠)。
更重要的是,有一些关于Listen的注释:
因此,实际上没有“监听文件”这样的事情,因为Listen会根据忽略规则对目录进行操作并过滤掉文件(有时是目录)。
如果您经常修改文件,这很重要,例如:日志文件或项目目录中的数据库文件,因为每次更改它们时,无论如何都会触发更改(轮询除外) - 由于忽略,您将看不到它。
LISTEN_GEM_DEBUGGING
(参见自述文件)。根据值(1
或2
),您可以看到Listen正在进行的系统事件,忽略的内容以及需要多长时间(请参阅Listen wiki以获取更多信息)。如果您对文档或倾听本身有任何反馈,请告诉我。
度过美好的一天!