【问题标题】:How to monitor individual files with Ruby listen gem?如何使用 Ruby listen gem 监控单个文件?
【发布时间】:2015-01-30 04:19:20
【问题描述】:

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

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

【问题讨论】:

    标签: ruby filesystems guard listen


    【解决方案1】:

    我没有注意我在这里做什么。 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
    

    【讨论】:

      【解决方案2】:

      只是一些您可能会觉得有用的提示:

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

        filenames = %w(foo.txt bar.js)
        listen_regex = /(?:#{file.map { |f| Regexp.quote(f) } * '|'})$
        

      (应该更靠谱一点)。

      1. 更重要的是,有几个关于Listen的注意事项:

        • 实际监听的内容取决于后端,例如轮询模式只是递归地扫描给定的目录(不包括匹配忽略正则表达式的文件),而例如MacOSX 上的 rb-fsevent 监视目录并每次物理扫描这些目录以查找更改。

      所以实际上并没有“监听文件”这回事,因为 Listen 对目录进行操作,并根据忽略规则过滤掉文件(有时是目录)。

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

      1. 要查看 Listen 中发生了什么,有一个很酷的调试选项:LISTEN_GEM_DEBUGGING(请参阅自述文件)。根据值(12),您可以看到 Listen 隐藏了哪些系统事件、忽略了什么以及需要多长时间(有关详细信息,请参阅 Listen wiki)。

      如果您对文档或 Listen 本身有任何反馈,请告诉我。

      祝你有美好的一天!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-06-10
        • 2012-08-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-28
        • 1970-01-01
        相关资源
        最近更新 更多