मैं एक मणि पर काम कर रहा हूं जिसे मणि स्थापित होने पर सशर्त रूप से निर्भरता सेट करने की आवश्यकता है। मैंनेएक रूबी मणि बनाएं और सशर्त रूप से निर्भरता निर्दिष्ट करें
पर कुछ खुदाई की है और ऐसा लगता है कि मैं इस आवश्यकता में अकेला नहीं हूं।
Rubygems: How do I add platform-specific dependency?
इस एक लंबे धागे
http://www.ruby-forum.com/topic/957999
एक ही रास्ता मैं निर्भरता को जोड़ने के लिए करने के लिए एक मणि एक में एक रत्न :: specifiction ब्लॉक के भीतर विधि add_dependency उपयोग करने के लिए है देख सकते हैं। gemspec फ़ाइल
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
नेट पर मिले सभी दस्तावेज़ों और धागे के आधार पर, मुझे उम्मीद थी rb-fsevent स्थापित की जाएगी
- लिनक्स मणि स्थापित है, तो, rb-inotify निर्भरता और ऑटो स्थापित
- मैक होगा rb-fchange स्थापित की जाएगी
हालांकि, ऐसा लगता है कि ऐसा नहीं है। जब मणि बनाया और पैक किया जाता है तब ब्लॉक के भीतर "if" कथन का मूल्यांकन किया जाता है। इसलिए, यदि आप लिनक्स पर मणि बनाते हैं और पैकेज करते हैं, तो आरबी-इनोटिफाइ एक निर्भरता, मैक, फिर, आरबी-फ़ेसेंट, विंडोज़-आरबी-फ़ेन्चेंज के रूप में जोड़ा जाता है।
अभी भी एक समाधान की आवश्यकता है, मैं rubygems कोड में चारों ओर खोद गया और ऐसा लगता है कि निम्नलिखित क्या होता है इसका एक व्यापक हिस्सा है।
- निर्माण अपने मणि के लिए अपने कोड के सभी: foo.gem
- एक foo.gemspec फ़ाइल
- निर्माण, पैकेज बनाते हैं, और इस तरह के rubygems.org
- के रूप में एक मणि सर्वर से मणि जारी सभी को
- डेवलपर इसे स्थानीय रूप से इंस्टॉल करें: gem install foo
- foo.gem फ़ाइल डाउनलोड, अनपॅक और स्थापित है। सभी निर्भरताओं को भी स्थापित किया जाता है।
- सब कुछ सेट किया जाना चाहिए और हम मणि का उपयोग कर beging कर सकते हैं।
ऐसा लगता है कि जब मणि बनाया गया है और जारी की है foo.gemspec फ़ाइल भरी हुई है और रत्न :: विशिष्टता ब्लॉक का मूल्यांकन किया और YAML में बदल जाती है, metadata.gz के रूप में संकुचित, और foo.gem में शामिल । रूबी कोड data.tar.gz में संपीड़ित है और साथ ही साथ भी शामिल है। जब स्थानीय डेवलपर मशीन पर मणि स्थापित किया जाता है, वाईएएमएल मेटाडेटा.gz से निकाला जाता है और वापस जेम :: विशिष्टता ब्लॉक में परिवर्तित किया जाता है, हालांकि, इसे मूल ब्लॉक में परिवर्तित नहीं किया जाता है।
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
ठीक है:
बजाय, आप निम्न की तरह कुछ देखेंगे।इसलिए, मेरे पास इस प्रक्रिया की चिड़िया का नजरिया है, हालांकि, यह एक मणि बनाने की सशक्तता को बदलता नहीं है और ओएस लक्ष्यों की एक श्रृंखला के लिए सशर्त रूप से निर्भरता निर्दिष्ट करता है।
यदि किसी के पास प्रत्येक लक्ष्य ओएस के लिए एकाधिक .gemspec फ़ाइलों को बनाने के अलावा कोई समाधान है ... मैं सभी कान हूं !!
http://stackoverflow.com/a/10249133/309514 पर मेरा उत्तर देखें, यह ठीक काम करता है। – Fotios