Я хочу искать свою файловую систему любые файлы с расширением .template
.
Ниже хорошо работает для всего кроме .htaccess.template
FileList.new(File.join(root, '**', '*.template')).each do |file|
# do stuff with file
end
потому что окнам не нравятся неназванные файлы, grrrr
Как я делаю эту работу над Windows? Этот код хорошо работает на Linux....
Если предположить, что 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 и убедился, что нет чего-то другого, вызывающего разницу в поведении.