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

如何使用Ruby listen gem监视单个文件?,ruby,filesystems,guard,listen,Ruby,Filesystems,Guard,Listen,我正试图使用listengem()来监听特定的文件,但到目前为止,我只能获得监听整个目录的基本功能 下面是我目前正在尝试的一个例子: require "listen" module FileTracker filedir = "/home/user/dir" filenames = [ "file1", "file2" ] # Should only track 'file1' and 'file2' in this directory listener = Listen.t

我正试图使用listengem()来监听特定的文件,但到目前为止,我只能获得监听整个目录的基本功能

下面是我目前正在尝试的一个例子:

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
我还尝试过只为
参数指定一个文件名作为字符串:
,但这也不起作用


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

我没有注意到我在这里做的事情<代码>仅限:显然需要一个正则表达式,我显然没有构造和提供它。希望这能帮助其他可能需要使用
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

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

  • 要正确引用regexp并使用regexp组而不捕获它们,请执行以下操作:

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

  • 更重要的是,这里有一些关于倾听的注释:

    • listen物理监视的内容取决于后端,例如轮询模式只是递归地扫描给定目录(不包括与ignore regexen匹配的文件),而MacOSX上的rb fsevent则每次监视目录并物理扫描这些目录以查看更改
  • 所以实际上没有“监听文件”这样的事情,因为监听操作在目录上,并根据忽略规则过滤出文件(有时是目录)

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

  • 要查看Listen中发生了什么,有一个很酷的调试选项:
    Listen\u GEM\u debug
    (请参阅自述)。根据值(
    1
    2
    ),您可以看到侦听的系统事件正在隐藏,它忽略了什么以及需要多长时间(有关更多信息,请参阅侦听wiki)
  • 如果您对文档或倾听本身有任何反馈,请告诉我

    祝你今天愉快