как я заставляю Ruby FileList брать файлы без имени, как .htaccess на окнах

Я хочу искать свою файловую систему любые файлы с расширением .template.

Ниже хорошо работает для всего кроме .htaccess.template

FileList.new(File.join(root, '**', '*.template')).each do |file|
    # do stuff with file
end 

потому что окнам не нравятся неназванные файлы, grrrr

Как я делаю эту работу над Windows? Этот код хорошо работает на Linux....

5
задан Andrew Bullock 29 March 2010 в 10:07
поделиться

2 ответа

Как насчет

Dir.glob([".*.template", "*.template"])
6
ответ дан 14 December 2019 в 08:46
поделиться

Если предположить, что FileList здесь - это класс FileList из rake, то проблема в том, что базовый класс Ruby Dir (который используется FileList) не подбирает файлы, начинающиеся с . для подстановочного знака *. Соответствующая часть rake.rb выглядит так

# Add matching glob patterns.
def add_matching(pattern)
  Dir[pattern].each do |fn|
    self << fn unless exclude?(fn)
  end
end

Ниже приведен уродливый хак, который отменяет add_matching, чтобы также включить файлы, начинающиеся с . Надеюсь, кто-нибудь предложит более элегантное решение.

class Rake::FileList
  def add_matching(pattern)
    files = Dir[pattern]
    # ugly hack to include files starting with . on Windows
    if RUBY_PLATFORM =~ /mswin/
      parts = File.split(pattern)
      # if filename portion of the pattern starts with * also
      # include the files matching '.' + the same pattern
      if parts.last[0] == ?*
        files += Dir[File.join(parts[0...-1] << '.' + parts.last)]
      end
    end    
    files.each do |fn|
      self << fn unless exclude?(fn)
    end
  end
end

Обновление: Я только что протестировал это на Linux, и файлы, начинающиеся с . тоже не включаются. Например, если у меня есть каталог /home/mikej/root с двумя подкаталогами a и b, где каждый содержит first. template и .other.template then

Rake::FileList.new('home/mikej/root/**/*.template')
=> ["/home/mikej/root/a/first.template", "/home/mikej/root/b/first.template"]

поэтому я бы дважды проверил поведение в Linux и убедился, что нет чего-то другого, вызывающего разницу в поведении.

1
ответ дан 14 December 2019 в 08:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: