2012-08-08 6 views
6

मैं हमेशा git का उपयोग किया है निर्धारित करने के लिए जो फ़ाइलों मणि पैकेज में जाना चाहिए के लिए फ़ाइलों की मणि की सूची का निर्धारण:विनिर्देश

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

दुर्भाग्य से, this approach has recently proved to be inappropriate। मुझे एक आत्मनिर्भर, शुद्ध-रूबी समाधान की आवश्यकता है।

मेरा पहला विचार बस पूरी निर्देशिका को ग्लोब करना था, लेकिन अकेले ही अवांछित फ़ाइलों को शामिल करने की संभावना है।

# 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 

एक gemspec के लिए थोड़ा जटिल लगता है कि: तो, समस्या पर शोध के बाद, मैं इस के साथ आया था। यह gitignore's pattern format का पूरी तरह से समर्थन नहीं करता है। यह वर्तमान में काम करता प्रतीत होता है लेकिन मैं बाद में समस्याओं में भाग नहीं लेगा।

क्या मणि की फ़ाइलों की सूची की गणना करने का एक आसान लेकिन मजबूत तरीका है? ज्यादातर रत्न स्पष्ट रूप से git ls-files का उपयोग करते हैं, और वे जो मेरे जैसे समाधान का उपयोग नहीं करते हैं या फ़ाइलों को मैन्युअल रूप से निर्दिष्ट नहीं करते हैं।

उत्तर

5

हाय,

आप शुद्ध रूबी के साथ अपनी परियोजना के सभी फ़ाइलों की सूची कर सकते हैं:

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

या आप मैन्युअल रूप से ऐसा कर सकते हैं, इस समाधान Ruby on Rails gems द्वारा किया जाता है:

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

ध्यान दें कि Rubygems पहले से ही आपके लिए निर्देशिकाओं को अनदेखा करता है: https://github.com/rubygems/rubygems/blob/master/lib/rubygems/specification.rb#L306-L307 - बस 'Dir [' **/* '] 'है शायद कई के लिए ठीक है परियोजनाओं। – Nevir