Tôi đang làm việc trên một viên ngọc có nhu cầu thiết lập các phụ thuộc có điều kiện khi đá quý được cài đặt. Tôi đã thực hiện một số việc đào bới xung quanhxây dựng một viên đá quý ruby và có điều kiện xác định phụ thuộc
và có vẻ như tôi không đơn độc trong nhu cầu này.
Rubygems: How do I add platform-specific dependency?
đây là một chủ đề dài
http://www.ruby-forum.com/topic/957999
Cách duy nhất tôi có thể thấy để thêm phụ thuộc vào một viên ngọc là sử dụng phương pháp add_dependency trong một khối Gem :: specifiction trong một. gemspec file
Gem::Specification.new do |s|
# ... standard setup stuff
# conditionally set dependencies
s.add_dependency "rb-inotify", "~> 0.8.8" if RUBY_PLATFORM =~ /linux/i
s.add_dependency "rb-fsevent", "~> 0.4.3.1" if RUBY_PLATFORM =~ /darwin/i
s.add_dependency "rb-fchange", "~> 0.0.5" if RUBY_PLATFORM =~ /mswin|mingw/i
end
Dựa trên tất cả tài liệu và chủ đề tôi tìm thấy trên mạng, tôi đã mong đợi tha t nếu bạn cài đặt các viên ngọc trên
- Linux, sau đó, rb-inotify sẽ là một sự phụ thuộc và tự động cài đặt
- Mac - rb-fsevent sẽ được cài đặt
- Windows - rb-fchange sẽ được cài đặt
Tuy nhiên, có vẻ như không phải như vậy. Các câu lệnh "if" trong khối được đánh giá tại thời điểm đá quý được xây dựng và đóng gói. Do đó, nếu bạn xây dựng và đóng gói gem trên Linux, thì rb-inotify được thêm vào như một phụ thuộc, Mac, sau đó, rb-fsevent, Windows-rb-fchange.
Vẫn còn cần một giải pháp, tôi đào xung quanh trong mã rubygems và có vẻ như sau đây là một stoke rộng của những gì sẽ xảy ra.
- xây dựng tất cả các mã của bạn cho đá quý của bạn: foo.gem
- tạo một file foo.gemspec
- xây dựng, đóng gói, và nhả ngọc đến một máy chủ đá quý như rubygems.org
- cho mọi người biết
- nhà phát triển cài đặt cục bộ qua: gem install foo
- tệp foo.gem được tải xuống, giải nén và cài đặt. tất cả các phụ thuộc cũng được cài đặt.
- mọi thứ nên được đặt và chúng ta có thể sử dụng đá quý.
Dường như khi đá quý được xây dựng và phát hành các tập tin foo.gemspec được nạp và khối Gem :: Thông số kỹ thuật được đánh giá và chuyển đổi sang YAML, nén như metadata.gz, và bao gồm trong foo.gem . Mã ruby được nén thành data.tar.gz và cũng được bao gồm. Khi gem được cài đặt trên máy phát triển cục bộ, YAML được trích xuất từ metadata.gz và được chuyển đổi trở lại thành khối Gem :: Specification, tuy nhiên nó không được chuyển đổi về khối gốc.
thay vào đó, bạn sẽ thấy một cái gì đó như sau:
Gem::Specification.new do |s|
if s.respond_to? :specification_version then
s.specification_version = 3
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
s.add_runtime_dependency(%q<rb-inotify>, ["~> 0.8.8"])
else
s.add_dependency(%q<rb-inotify>, ["~> 0.8.8"])
end
else
s.add_dependency(%q<rb-inotify>, ["~> 0.8.8"])
end
end
Ok.Vì vậy, tôi có một cái nhìn của một con chim của quá trình, tuy nhiên, điều đó không thay đổi mong muốn của tôi để xây dựng một viên ngọc duy nhất và có điều kiện xác định phụ thuộc cho một loạt các mục tiêu hệ điều hành.
Nếu có ai có giải pháp khác ngoài việc tạo nhiều tệp .gemspec cho từng hệ điều hành đích ... Tôi là tất cả tai !!
Nhìn vào câu trả lời của tôi cho http://stackoverflow.com/a/10249133/309514, nó hoạt động tốt. – Fotios