2012-11-23 21 views
6

मैं एक मणि बनाना चाहता हूं, और जब कोई और इसे एमआरआई के साथ उपयोग करने का प्रयास करता है तो यह सी कोड का उपयोग करेगा, और जब वे इसे JRuby से उपयोग करेंगे तो यह जावा कोड का उपयोग करेगा।मैं एक मणि कैसे बना सकता हूं जो एमआरआई और जेआरबी दोनों को लक्षित करता है?

नोकोगिरी और प्यूमा रत्न ऐसा करते हैं, और मैंने उनके कोड पर देखा है, लेकिन यह नहीं देखा कि वे इसे कैसे बना रहे थे।

+0

यह भी देखें http://stackoverflow.com/questions/3642085/make-bundler-use-different-gems-for- dififferent-platforms – knut

+0

यही वह बात नहीं है जिसके बारे में मैं बात कर रहा हूं। मैं एक मणि बनाना चाहता हूं, और जब कोई और इसे एमआरआई के साथ उपयोग करने का प्रयास करता है तो वह सी कोड का उपयोग करेगा, और जब वे इसे JRuby से उपयोग करेंगे तो यह जावा कोड का उपयोग करेगा। नोकोगिरी और प्यूमा रत्न ऐसा करते हैं, और मैंने उनके कोड पर देखा है, लेकिन यह नहीं देखा कि वे इसे कैसे बना रहे थे – jshen

+0

रूबी में मणि लिखना सबसे आसान तरीका है, इस तरह आप इसे 'jRuby' पर चलाते हैं , 'एमआरआई' या कोई कार्यान्वयन। यह ठीक चल जाएगा। आपने निर्दिष्ट नहीं किया है कि आपके मणि के लिए बाहरी निर्भरता क्या हैं। – nikhil

उत्तर

6

यह आरवीएम (या रूबी के बीच स्विच करने के लिए अन्य समान उपकरण) और rake-compiler का उपयोग करके लक्षित विभिन्न प्लेटफार्मों के लिए मणि को पार करने के द्वारा किया जाता है।

gemspec फ़ाइल प्रत्येक प्लेटफॉर्म के लिए आवश्यक फ़ाइलों को निर्दिष्ट करना होगा; इस मंच की जाँच के द्वारा किया जाता है मणि के साथ संकलित किया जा रहा है:

spec = Gem::Specification.load('hello_world.gemspec') 

if RUBY_PLATFORM =~ /java/ 
    require 'rake/javaextensiontask' 
    Rake::JavaExtensionTask.new('hello_world', spec) 
else 
    require 'rake/extensiontask' 
    Rake::ExtensionTask.new('hello_world', spec) 
end 

लेकिन आप विशिष्ट क्या करने की जरूरत हो सकता है: Rakefile में

Gem::Specification.new do |gem| 
# . . . 

    if RUBY_PLATFORM =~ /java/ 
    # package jars 
    gem.files += ['lib/*.jar'] 
    # . . . 
    else 
    # package C stuff 
    gem.files += Dir['ext/**/*.c'] 
    # . . . 
    gem.extensions = Dir['ext/**/extconf.rb'] 
    end 
end 

, rake-compiler स्थापित करने के बाद, पैटर्न आमतौर पर निम्नलिखित है विभिन्न प्लेटफॉर्म के लिए कार्य।

एमआरआई के साथ, तो आप rake native gem के साथ संकलित करें; JRuby के साथ, rake java gem - यह वह जगह है जहां आरवीएम जैसे टूल आसान हो जाते हैं। अंत में आप अपने मणि के लिए अलग-अलग मणि फाइलों के साथ समाप्त होते हैं, प्रति प्लेटफॉर्म पर, जिसे आप अपने मणि के रूप में रिलीज़ कर सकते हैं।

अधिक जानकारी के लिए rake-compiler documentation देखें, या इस तरह के redcloth या pg_array_parser (मुझे लगता है कि वे इस के लिए nokogiri की तुलना में बेहतर उदाहरण हैं) के रूप में अन्य परियोजनाओं है कि एक ही करते हैं, की जाँच करें।