ho sempre usato git
per determinare quali file dovrebbero andare nel pacchetto gemma:Determinazione lista del gioiello di file per la specifica
gem.files = `git ls-files`.split "\n"
Purtroppo, this approach has recently proved to be inappropriate. Ho bisogno di una soluzione autosufficiente, pura-Rubino.
La mia prima idea era quella di mappare semplicemente l'intera directory, ma solo questo probabilmente include i file indesiderati. Così, dopo la ricerca il problema, mi si avvicinò con questo:
# example.gemspec
directory = File.dirname File.expand_path __FILE__
dotfiles = %w(.gitignore .rvmrc)
ignore_file = '.gitignore'
file_list = []
Dir.chdir directory do
ignored = File.readlines(ignore_file).map(&:chomp).reject { |glob| glob =~ /\A(#|\s*\z)/ }
file_list.replace Dir['**/**'] + dotfiles
file_list.delete_if do |file|
File.directory?(file) or ignored.any? { |glob| File.fnmatch? glob, file }
end
end
# Later...
gem.files = file_list
Che sembra un po 'complessa per un gemspec
. Inoltre, non supporta completamente gitignore
's pattern format. Al momento sembra funzionare, ma preferirei non incorrere in problemi più tardi.
Esiste un modo più semplice ma efficace per calcolare l'elenco di file della gemma? La maggior parte delle gemme apparentemente usa git ls-files
e quelle che non usano una soluzione simile alla mia o specificano i file manualmente.
Nota che Rubygems ignora già le directory per te: https://github.com/rubygems/rubygems/blob/master/lib/rubygems/specification.rb#L306-L307 - solo 'Dir ['**/*']' è probabilmente va bene per molti progetti. – Nevir