2012-08-08 11 views
6

için dosyaların GEM listesini belirleme: MaalesefHep dosyalar mücevher paketine gitmek gerektiğini belirlemek için <code>git</code> kullandım şartname

gem.files = `git ls-files`.split "\n" 

, this approach has recently proved to be inappropriate. İhtiyacım olan, tam bir Ruby çözümüne ihtiyacım var.

İlk düşüncem sadece dizinin tamamını karıştırmaktı, ancak tek başına istenmeyen dosyaları içerme olasılığı yüksektir. Yani, sorun üzerinde araştırma sonra ben bu geldi: Bir gemspec için biraz karmaşık görünüyor

# 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 

. Ayrıca tam olarak gitignore's pattern format'u desteklemiyor. Şu anda işe yarıyor gibi görünüyor ama daha sonra problemlerle karşılaşmamayı tercih ediyorum.

Gem'in dosya listesini hesaplamanın daha basit ama sağlam bir yolu var mı? Çoğu mücevher görünüşte git ls-files kullanıyor ve benimkiyle benzer bir çözüm kullanmayan veya dosyaları elle belirtenler. Sen saf Ruby ile projenin tüm dosyaları listeleyebilirsiniz

cevap

5

Merhaba,:

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

Yoksa elle yapabilirsiniz, bu çözüm Ruby on Rails gems tarafından kullanılır:

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

Rubygems'in zaten sizin için dizinleri göz ardı ettiğini unutmayın: https://github.com/rubygems/rubygems/blob/master/lib/rubygems/specification.rb#L306-L307 - sadece 'Dir ['**/*']' dir Muhtemelen birçok kişi için iyi projeler. – Nevir