2012-08-08 15 views
6

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.

risposta

5

Ciao,

È possibile elencare tutti i file del tuo progetto con puro Rubino:

gem.files = Dir['**/*'].keep_if { |file| File.file?(file) } 

Oppure si può fare manualmente, questa soluzione è utilizzata da Ruby on Rails gems:

gem.files = Dir['lib/**/*'] + %w(.yardopts Gemfile LICENSE README.md Rakefile my_gem.gemspec) 
+0

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

Problemi correlati