如何使用Ruby listen gem监视单个文件?

时间:2014-12-02 01:53:20

标签: ruby filesystems guard listen

我正在尝试使用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:参数的字符串,但这也不起作用。

我的最终目标是能够在各种目录中跟踪用户定义文件的列表以进行更改。我只想跟踪每个特定文件,而不是整个目录。

2 个答案:

答案 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)

您可能会发现一些有用的提示:

  1. 正确引用正则表达式并使用正则表达式组而不捕获它们:

    filenames = %w(foo.txt bar.js)
    listen_regex = /(?:#{file.map { |f| Regexp.quote(f) } * '|'})$
    
  2. (应该更可靠)。

    1. 更重要的是,有一些关于Listen的注释:

      • 听物理手表取决于后端,例如轮询模式只是递归地扫描给定目录(不包括与忽略正则表达式匹配的文件),例如, MacOSX上的rb-fsevent监视目录并每次对这些目录进行物理扫描以进行更改。
    2. 因此,实际上没有“监听文件”这样的事情,因为Listen会根据忽略规则对目录进行操作并过滤掉文件(有时是目录)。

      如果您经常修改文件,这很重要,例如:日志文件或项目目录中的数据库文件,因为每次更改它们时,无论如何都会触发更改(轮询除外) - 由于忽略,您将看不到它。

      1. 要了解Listen中发生了什么,有一个很酷的调试选项:LISTEN_GEM_DEBUGGING(参见自述文件)。根据值(12),您可以看到Listen正在进行的系统事件,忽略的内容以及需要多长时间(请参阅Listen wiki以获取更多信息)。
      2. 如果您对文档或倾听本身有任何反馈,请告诉我。

        度过美好的一天!