2012-01-20 3 views
18

मैं एक मणि पर काम कर रहा हूं जिसे मणि स्थापित होने पर सशर्त रूप से निर्भरता सेट करने की आवश्यकता है। मैंनेएक रूबी मणि बनाएं और सशर्त रूप से निर्भरता निर्दिष्ट करें

पर कुछ खुदाई की है और ऐसा लगता है कि मैं इस आवश्यकता में अकेला नहीं हूं।

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 फ़ाइलों को बनाने के अलावा कोई समाधान है ... मैं सभी कान हूं !!

  • +0

    http://stackoverflow.com/a/10249133/309514 पर मेरा उत्तर देखें, यह ठीक काम करता है। – Fotios

    उत्तर

    1

    मैं इस अपने आप को कभी नहीं किया है, लेकिन वहाँ कुछ जवाहरात कि मंच में उपलब्ध हैं विशिष्ट संस्करण हैं: http://rubygems.org/gems/libv8/versions

    क्या मैं समझता हूँ कि यह सिर्फ एक नामकरण बात है से

    , के मंच विकल्प सेट करने से विन्यस्त किया जा सकता है जो आपके gemspec। दस्तावेज़ पर एक नज़र डालें: http://guides.rubygems.org/specification-reference/#platform=

    0

    मैंने इसे भी देखा है और इस निष्कर्ष पर पहुंचा है कि डिजाइन द्वारा संभव नहीं है। सभी प्लेटफार्मों के लिए एक 'मेगा मणि' होने से यह जानने की समस्या होती है कि मणि डाउनलोड होने और स्थापित होने तक प्लेटफ़ॉर्म समर्थित है या नहीं। एक जेम को प्लेटफॉर्म के आधार पर स्थापित करने का सही तरीका निर्धारित करने के लिए पर्याप्त स्मार्ट होना होगा। यदि कोई प्लेटफ़ॉर्म बिल्कुल समर्थित नहीं है, तो मणि कीड़े का एक बड़ा हिस्सा खोलने से, गंभीर रूप से असफल हो सकता है। एक मणि स्थापित करने के बाद कॉलबैक होने के लिए उपयोग किया जाता है जिसे उसी कारण से हटा दिया गया था, कोई जादू नहीं है ताकि सही तरीके से इंस्टॉल किया जा सके। कुछ लोगों ने mkmf का उपयोग करके इस पर हैक किया है, लेकिन मैं बेहतर समाधान के रूप में प्रति मंच एक मणि के पहने पथ का पालन करने का सुझाव देता हूं।

    इस पर आधारित, एक परियोजना में जो रूबी और जर्बी के लिए एक मणि बनाता है, मुझे मैन्युअल रूप से प्रत्येक मणि बनाने और उन्हें RubyGem पर अपलोड करना होगा। Jeweler का उपयोग करना यह Gemfile निर्दिष्ट करने जितना आसान है, लेकिन जब भी मैं एक मणि पैकेज करता हूं तो मुझे मणि स्पेक का पुनर्निर्माण करना होता है। केवल 2 प्लेटफार्मों का समर्थन करते समय काफी मामूली, लेकिन निर्माण प्रक्रिया सीधे आगे है कि इसे एकाधिक प्लेटफार्म रत्नों को समर्थन प्रदान करने के लिए स्वचालित किया जा सकता है।

    1

    मैंने अतीत में इस समस्या पर भी ठोकर खाई है। एकमात्र कामकाज मुझे मिल सकता था निर्भरता स्थापित करने के लिए एक रेक कार्य बनाना था। बेशक, उस चरण में, आप शायद उपयोगकर्ता को अपने स्वयं के त्रुटि संदेश के आधार पर गायब होने के बारे में बता सकते हैं। मेरे मामले में, कई प्लेटफार्म-निर्भर निर्भरताओं को स्थापित किया जाना था, इसलिए यह एक विकल्प नहीं था।

    Rakefile:

    task :install do |t| 
        require './lib/library/installer' 
        Library::Installer.install 
    end 
    

    इंस्टालर:

    module Library::Installer 
    
        require 'rubygems/dependency_installer' 
    
        def self.install 
        installer = Gem::DependencyInstaller.new 
        dependency = case RUBY_PLATFORM 
         when /darwin/i then ["rb-fsevent", "~> 0.4.3.1"] 
         when /linux/i then ["rb-inotify", "~> 0.8.8"] 
         when /mswin|mingw/i then ["rb-fchange", "~> 0.0.5"] 
        end 
        installer.install(*dependency)   
    end 
    

    फिर, यदि उपयोगकर्ता rake install उपयोग कर सकते हैं उचित निर्भरता स्थापित पाने के लिए।

    सशर्त निर्भरता स्थापित (केवल मंच पर आधारित नहीं है, लेकिन उदाहरण के लिए उपयोगकर्ता इनपुट पर आधारित) रूबीजम्स को क्रूर रूप से गायब है। आइए आशा करते हैं कि यह भविष्य में लागू हो जाएगा!

    संबंधित मुद्दे