2012-02-17 12 views
16

मेरे पास एक सी # प्रोजेक्ट है जिसमें मैंने आयरनआरबी प्रोग्राम एम्बेड किया है। प्रोजेक्ट (मेरी रूबी स्क्रिप्ट समेत) वितरण के लिए विजुअल स्टूडियो 2010 में एक .exe फ़ाइल में संकलित किया गया है। मैं IronRuby स्क्रिप्ट बूटस्ट्रैपिंग के लिए इस तरह के पैटर्न का उपयोग कर रहा हूं: http://pastebin.com/NKes1cyc (और जिमी Schementi यहां अधिक विस्तार से चला जाता है: http://blog.jimmy.schementi.com/2009/12/ironruby-rubyconf-2009-part-35.html)।एक सी # प्रोजेक्ट में रूबी मणि को कैसे एम्बेड करें और इसे एम्बेडेड आयरनरुबी स्क्रिप्ट से इसकी आवश्यकता है?

मेरी समस्या: मैं अपने सी # असेंबली में एक मणि (json_pure) एम्बेड करना चाहता हूं और इसे रूबी स्क्रिप्ट से कॉल करना चाहता हूं।

कुछ संसाधनों मैंने पाया:

  1. JRuby में, आप आसानी से एक जार फ़ाइल में एक रत्न पैकेज कर सकते हैं और फिर बस कार्यावधि में जार फ़ाइल की आवश्यकता होती है - http://blog.nicksieger.com/articles/2009/01/10/jruby-1-1-6-gems-in-a-jar

  2. irpack उपकरण (http://github.com/kumaryu/irpack पर) रूबी को एक .exe में संकलित करने में सक्षम है (मुझे लगता है कि यह गतिशील रूप से सी # प्रोजेक्ट बनाता है और संकलित करता है) रूबी मानक लाइब्रेरी को एम्बेड करते समय। लेकिन ऐसा लगता है कि यह केवल पूर्व-निर्मित IronRuby .dlls को एम्बेड कर रहा है, रूबी। आरबी फाइल नहीं। इस टूल का उपयोग करने का दृष्टिकोण काम करेगा यदि मैं यह समझ सकता हूं कि रुबी स्रोत फ़ाइलों को एक .dll में कैसे संकलित करना है।

मैं एक सी # विधानसभा में एक IronRuby मणि कैसे एम्बेड करूं (या एक .dll के लिए एक IronRuby मणि संकलन)?

संपादित करें:

पृष्ठ IronRuby कार्रवाई में 472 ("बाहरी पुस्तकालय का उपयोग करना") बताते हैं कि कैसे एक एम्बेडेड माणिक फ़ाइल के भीतर से मानक रूबी पुस्तकालयों की आवश्यकता होती है। यह क्रम खोज रास्तों संग्रह करने के लिए फ़ोल्डर (रों) जोड़ दिया जाता है, इस प्रकार है (संक्षिप्तता और स्पष्टता के लिए संपादित):

ScriptEngine engine = IronRuby.Ruby.CreateEngine(); 
var searchPaths = engine.GetSearchPaths().Concat(new[] 
{ 
    "C:\\Program Files (x86)\\IronRuby 1.1\\Lib\\ruby\\1.9.1", 
    "C:\\Program Files (x86)\\IronRuby 1.1\\Lib\\ironruby" 
}); 
engine.SetSearchPaths(searchPaths) 

यह दृष्टिकोण होस्ट मशीन IronRuby स्थापित किया है मान लिया गया है, लेकिन मैं रूबी फ़ाइलें एम्बेड करने के लिए (चाहते हैं एक मणि से) असेंबली में ताकि इसे IronRuby पूर्व-स्थापित किए बिना चलाया जा सके।

संपादित 2 (आगे अनुसंधान):

ऊपर संदर्भित irpack उपकरण के स्रोत कोड के माध्यम से पढ़ना, मुझे लगता है कि Kumaryu System.IO.Packaging.Package वर्ग के माध्यम से अंतिम सभा में संसाधनों embedding है नोटिस , और फिर msbuild को कॉल में पैकेज पास कर रहा है (https://github.com/kumaryu/irpack/blob/master/lib/irpack/packager.rb देखें)। शायद निष्पादन योग्य में पैकेजिंग फ़ाइलों में कुछ और शोध एक समाधान का कारण बन जाएगा। मुझे लगता है कि समस्या यह है कि एक मणि require अन्य रूबी फाइलों में रूबी फाइलें ... एक असेंबली पैकेज में एक रूबी फ़ाइल require एक ही पैकेज में अन्य रूबी फाइलें कर सकती हैं?

संपादित करें 3:

मैं अभी तक एक जवाब के लिए आगे किसी भी नहीं मिला है, लेकिन मैं किसी की प्रतिक्रियाओं का इंतज़ार है, भले ही यह सिर्फ एक लिंक या देखने के लिए जहां के बारे में एक सुझाव है दिलचस्पी होगी। मैं msbuild के लिए नया हूँ, और दस्तावेज़ीकरण बहुत भारी है। "Msbuild एम्बेड ज़िप पैकेज" के लिए प्रारंभिक वेब खोज ने कुछ भी प्रासंगिक नहीं बताया।

+0

देखें http://blog.nicksieger.com/articles/2009/01/10/jruby-1-1-6-gems-in-a-jar - मुझे कुछ ऐसी चीज बनाने में मदद चाहिए जो यह आसान है पैकेजिंग रत्न के लिए उपयोग करें। –

उत्तर

3

Require is a method जिसे किसी अन्य रूबी विधि की तरह ओवरराइड किया जा सकता है। मुझे लगता है कि मूल रूबी रत्न पैकेज कैसे काम करता है, रत्न बस require ओवरराइड करेगा।

यदि आप किसी भी तरह से अपने .exe में मणि पैकेज कर सकते हैं, तो आप असेंबली से लोड करने के लिए require ओवरराइड कर सकते हैं।

+0

टिडबिट के लिए धन्यवाद! +1 - जो पहेली का हिस्सा हल करता है। –

+0

सबसे खराब, आप रूबी फ़ाइलों को सी # में एम्बेड कर सकते हैं, स्ट्रिंग some_ruby_file_rb = "...." – sbridges

+0

कुछ रूबी रत्नों में रूबी फाइलों की कई निर्देशिकाएं होती हैं। मेरे पास एक पैकेजिंग तंत्र होगा जो उस संरचना को बरकरार रखेगा (अन्यथा, मुझे मणि में प्रत्येक .rb फ़ाइल को संपादित करना होगा; यह सक्रिय_रेकॉर्ड या json_pure जैसे बड़े रत्नों के लिए नहीं होगा)। –

3

कोशिश इस https://github.com/rifraf/IronRubyAppPackager#readme (या मुझे क्या यह पुस्तकालय मैं एम्बेड करने के लिए कोशिश कर रहा हूँ के साथ काम करता पर वापस रिपोर्ट करने के लिए प्रतीक्षा)

वापस रिपोर्टिंग:

प्रक्रिया मैं करने के लिए किया जाता है चले गए हैं ...

  1. कांटा और submodule सभी परियोजनाओं (IronRubyEmbeddedApps, IronRubyAppPackager, Serfs और Vendorize) https://github.com/rifraf से, और उन सब एक वी.एस. समाधान में जोड़ा। मैं सभी परियोजनाओं .NET4 के लिए अद्यतन और उन्हें एक दूसरे का संदर्भ है, बल्कि शामिल .net2 विधानसभाओं

  2. निष्पादित Vendorize सभी निर्भरता/जवाहरात D:\projects\SomeLibrary\lib_vendor_ चीर करने के लिए की तुलना में चल रहा है के द्वारा बनाई गई:

    D:\projects\SomeLibrary\lib>ruby -I..\..\Vendorize\lib -rvendorize some_lib.rb

  3. चल रहा द्वारा D:\projects\SomeLibrary\lib\_IRPackager_\some_lib.csproj में उत्पन्न एसी # परियोजना:

    D:\projects\SomeLibrary\lib>ruby -I..\..\IronRubyAppPackager\lib\IRPackager.rb some_lib.rb

  4. मेरी समाधान के लिए some_lib.csproj जोड़ा गया, यह .net4 करने के लिए उन्नत और फिक्स्ड संदर्भ

  5. इस बिंदु पर, आप नेट, स्टैंडअलोन में परियोजना चला सकते हैं,
var Ruby = new EmbeddedRuby(); 
Ruby.Decoder = new Program.GZipDecoder(); 
Ruby.Mount("App"); 
Ruby.Run("gocardless.rb"); 
चलाकर

और यह सफल हुआ! शानदार मैंने सोचा!

वास्तव में इस बिंदु पर मुझे पता चला कि यह प्रत्येक आवश्यक पुस्तकालय को वेंडोरिज़ करने के लिए चरण 2 में विफल रहा था। require कॉल को अवरुद्ध करके वेंडरिज़ काम करता है और फिर _Vendor_ पर कॉल की गई आरबी फाइलों को सहेजता है - यदि require निष्पादित नहीं किया गया है (इसलिए सभी परीक्षण चलाएं और उम्मीद है कि परीक्षण कवरेज 100% है) इसे नहीं उठाया जाएगा।

किसी कारण से, यह आवश्यक फ़ाइलों में से एक को उठा नहीं रहा था, भले ही आवश्यकताएं थीं। अंत में, मैंने अपनी लाइब्रेरी को कॉपी करके और bundle install --deployment कमांड का उपयोग करके विक्रेता निर्देशिका के लिए मैन्युअल रूप से सामग्री बनाई। चरण 3 और 4 दोहराएं और मैं कर रहा हूं ... सही?

नहीं, जब मैं जेनरेट प्रोजेक्ट चलाता हूं तो मुझे no such file to load -- json/pure के बारे में कुछ त्रुटि मिलती है - मुझे लगता है कि यह लोहे की एक संयोजन करने के लिए कुछ है जो देशी जेसन कार्यान्वयन नहीं कर रहा है, मैं मैनुअल वेंडोरिज़िंग कर रहा हूं और मुझे कई चीजों को चकमा देना है आज अंक

निष्कर्ष निकालने के लिए - यह विधि बहुत ही काम करती है, अगर आपकी लाइब्रेरी और इसकी निर्भरता ठीक से लोहे के साथ काम करती है तो काम करेगी, और आप ठीक से काम करने के लिए विक्रेता बन सकते हैं।

मैं लाइब्रेरी को सी # पुराने तरीके से छोड़कर पोर्ट कर रहा हूं।

संपादित करें: जैसा कि नीचे बताया गया है, राइफ्रफ़ मेरी मदद कर रहा है और मेरे द्वारा उपयोग किए जा रहे टूल को अपडेट करने की तलाश में है। इस जगह को देखो!

+0

लिंक के लिए धन्यवाद! यह आशाजनक लग रहा है। –

+0

ने – mcintyre321

+0

पर रिपोर्ट की है मुझे अतीत में json_pure के साथ भी परेशानी हुई है। मुझे पता है कि एक समाधान है (मैंने इसे पहले हल किया)। अगर मैं याद कर पाऊंगा तो मैं वापस आऊंगा ... (शायद 'igem install json_pure' को आजमाएं?) –

3

मैं अपने पैकेजिंग कोड (https://github.com/rifraf/IronRubyAppPackager#readme) का उपयोग कर अपनी लाइब्रेरी को सी #/आयरन रूबी में लपेटने के लिए https://stackoverflow.com/users/2086/mcintyre321 के साथ काम कर रहा हूं।

वेंडोरिज चरण में आवश्यक कुछ फ़िक्सेस हैं जो रूबी के बाद के संस्करणों से संबंधित हैं जो लोड होने के बजाय एम्बेडेड रूबीजम्स हैं, लेकिन प्रगति की जा रही है।

उनके कोड को 'जेसन' की आवश्यकता है, और मेरे पास सी-लिंकेज की बजाय रुबी कार्यान्वयन का उपयोग करने के लिए मजबूर करने के लिए एक चाल है। इसलिए फाइलें। इसका मतलब यह होना चाहिए कि यह IronRuby ठीक से काम करेगा। वापस रिपोर्ट करेंगे, या उस स्रोत के साथ मुझसे संपर्क करने में संकोच न करें जिसे आप चलाना चाहते हैं।

+0

आपको वापस रिपोर्ट करने की प्रतीक्षा कर रहा है - बक्षीस जल्द ही समाप्त हो जाता है :) –

+0

अगर मैं इसे सब काम कर रहा हूं तो मैं राइफ्रफ़ को बक्षीस दूंगा! :) – mcintyre321