2012-01-01 14 views
15

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

gem "eventmachine", "~> 1.0.0.beta.4.1", :group => :development_win 
gem "eventmachine", group => :development_linux 
gem "thin 

अगर वहाँ इससे बचने के लिए, हो सकता है खिड़कियों के लिए एक gemfile और लिनक्स के लिए एक gemfile का उपयोग कर एक तरीका था मैं सोच रहा था, क्या आदेश एक या दूसरे को लोड करना होगा।

वैकल्पिक रूप से गिट में शायद दो अलग-अलग प्लेटफार्मों के लिए रत्न का प्रबंधन करने का एक तरीका है, शायद फाइल के लिए शाखा के माध्यम से (पता नहीं है कि मैंने गिट शाखाओं के बारे में क्या पढ़ा है)।

उत्तर

20

देखें आपको लगता है कि जैसे कि यह कर सकते हैं:

# Windows 
gem "eventmachine", "~> 1.0.0.beta.4.1", :platform => [:mswin, :mingw] 

# C Ruby (MRI) or Rubinius, but NOT Windows 
gem "eventmachine", :platform => :ruby 

उपलब्ध प्लेटफार्मों की पूर्ण सूची:

ruby  C Ruby (MRI) or Rubinius, but NOT Windows 
ruby_18 ruby AND version 1.8 
ruby_19 ruby AND version 1.9 
ruby_20 ruby AND version 2.0 
mri  Same as ruby, but not Rubinius 
mri_18 mri AND version 1.8 
mri_19 mri AND version 1.9 
mri_20 mri AND version 2.0 
rbx  Same as ruby, but only Rubinius (not MRI) 
jruby  JRuby 
mswin  Windows 
mingw  Windows 'mingw32' platform (aka RubyInstaller) 
mingw_18 mingw AND version 1.8 
mingw_19 mingw AND version 1.9 
mingw_20 mingw AND version 2.0 

आप Gemfile(5) आदमी पेज here में अधिक जानकारी प्राप्त कर सकते हैं (' प्लेटफॉर्म 'अनुभाग)। मैं RUBY_PLATFORM के लिए उपलब्ध मूल्यों की पूरी सूची नहीं देखा है, लेकिन आप

ruby -e 'puts RUBY_PLATFORM' 
दोनों अपने प्लेटफॉर्म पर

चलाने के लिए और अंतर देख सकते हैं

if RUBY_PLATFORM =~ /win32/ 
    gem "eventmachine", "~> 1.0.0.beta.4.1" 
else 
    gem "eventmachine" 
end 

:

एक और दृष्टिकोण RUBY_PLATFORM निरंतर उपयोग करने के लिए है ।

+3

हम्म, पहला समाधान रत्न में निर्दिष्ट दो रत्नों के बारे में एक ही त्रुटि फेंकता है। सशर्त बयान ठीक काम करता है। – indigo0086

+6

और दूसरा दृष्टिकोण अमान्य है, क्योंकि यह 'Gemfile.lock' में एक या अन्य मणि संस्करण संग्रहीत करता है। यह दोनों स्टोर नहीं कर सकता है। इस प्रकार यदि आप Win32 dev मशीन पर 'Gemfile.lock' तैयार करते हैं तो इसे लिनक्स पर तैनात करें, आपको वही गलत संस्करण मिल जाएगा। इस प्रकार मैं अभी भी एक वैध समाधान की तलाश में हूं। –

+1

: प्लेटफ़ॉर्म दृष्टिकोण अच्छी तरह से काम करता है बशर्ते कि विभिन्न प्लेटफार्मों के लिए केवल अलग-अलग (नामित) रत्न की आवश्यकता हो, Gemfile.lock को प्रतिबद्ध करना और इसे स्थिर रखना (यदि अन्यथा दृष्टिकोण के विपरीत) – prusswan

3

आप विभिन्न प्लेटफार्मों के लिए विभिन्न जेमफ़ाइल का उपयोग करने के लिए --gemfile विकल्प का उपयोग कर सकते हैं। प्रलेखन यहाँ http://gembundler.com/man/bundle-config.1.html

+0

मुझे लगता है: 1. 'अलग gemfiles' तुम्हारा मतलब द्वारा हालांकि, इस करते हैं, जैसे, दोनों Gemfile-linux और Gemfile-windows स्वचालित रूप से शामिल है जो कुछ भी Gemfile बयानों वे आम में साझा को बेहतर बनाता है 'अलग' जेमफाइल '(' अलग मणि फाइल नहीं '); और 2।'--gemfile' से आपका मतलब पर्यावरण चर 'BUNDLE_GEMFILE' या' bundle/config' '(डेवलपर्स की होम निर्देशिकाओं में) में' gemfile' कॉन्फ़िगरेशन सेटिंग या तो है। इस प्रकार बंडलर सुरक्षित रूप से बना सकता है उदा। 'Gemfile-linux.lock' और' Gemfile-windows.lock'। – MarkDBlackwell

0

आपको एक मणि के कई संस्करणों (सभी एक ही नाम के साथ) की आवश्यकता है। इसलिए, वर्तमान में बंडलर के साथ, आपको एकाधिक, एक साथ बंडलर निर्भरता स्नैपशॉट 'लॉक' फ़ाइलों की आवश्यकता है। यह संभव है, यदि आपके डेवलपर बंडलर के gemfile कॉन्फ़िगरेशन सेटिंग का उपयोग करते हैं।

  1. (कमांड लाइन पर या .bash_profile में) वातावरण चर BUNDLE_GEMFILE का इस्तेमाल कर रही द्वारा;: वे या तो इस कर सकता या
  2. (शायद कम वांछनीय) .bundle/config (वैश्विक रूप से, उनके घर निर्देशिका में) में।

इस प्रकार, सुरक्षित रूप से, बंडलर (और संभावित रूप से बाद में स्वचालित रूप से उसी कॉन्फ़िगरेशन सेटिंग्स को देखते हुए उपयोग कर सकता है) उदा। Gemfile-linux.lock और Gemfile-windows.lock

हालांकि यह मूल दृष्टिकोण व्यावहारिक लगता है, यह बहुत शुष्क नहीं है। अर्थात यदि वे बयान में शामिल हैं::

::Kernel.eval(File.open('Gemfile-common','r'){|f| f.read},::Kernel.binding)

+0

उत्तर के लिए धन्यवाद लेकिन मैं वर्षों में रूबी का उपयोग नहीं किया है, लेकिन मुझे यकीन है कि 2012 में जवाब संतोषजनक था। – indigo0086

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

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