2012-08-08 3 views
6

에 대한 파일의 보석의 목록을 결정 : 불행하게도난 항상 파일이 보석 패키지로 가야를 결정하는 <code>git</code>을 사용했습니다 사양

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

, this approach has recently proved to be inappropriate을. 나는 독립적 인 Ruby 솔루션이 필요합니다.

내 첫 번째 아이디어는 전체 디렉토리를 단순히 글로브하는 것이었지만 불필요한 파일을 포함시킬 가능성이 높습니다. 그래서이 문제를 연구 한 후에, 나는이 함께했다하십시오 gemspec에 대한 조금 복잡한 것 같습니다

# 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 

합니다. 또한 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