2011-12-07 6 views
12

मेरे पास एक रेल ऐप है जिसे मैं विंडोज़ पर विकसित कर रहा हूं और लिनक्स पर तैनात कर रहा हूं। मुझे संदेह है कि मैं पूरी तरह से भविष्य में लिनक्स पर स्विच कर दूंगा। वैसे भी, लिनक्स पर मुझे 'execjs' और 'therubyracer' की आवश्यकता है लेकिन मुझे Win7 में उन लोगों की आवश्यकता नहीं है। तो मैं अपने gemfile में इन पंक्तियों के रख:आपके gemfile काम में "प्लेटफ़ॉर्म =>" का उपयोग कर रहा है?

gem 'therubyracer', :platforms => :ruby 
gem 'execjs', :platforms => :ruby 

लिनक्स वी एम पर एक bundle install Ran और एप्लिकेशन ठीक ऊपर शुरू कर दिया। लेकिन विंडोज पर मैं:

Uncaught exception: Could not find execjs-1.2.11 in any of the sources

अब, से मैं क्या पढ़ा (प्लेटफार्म के तहत here) यह मुझसे कहता है कि "एक रत्न केवल एक विशेष मंच में इस्तेमाल किया जाना चाहिए, तो या प्लेटफार्मों की निर्धारित करते हैं, आप निर्दिष्ट कर सकते ruby C Ruby (MRI) or Rubinius, but NOT Windows ": उन्हें"

gem "weakling", :platforms => :jruby 

और यह कहते हैं और नमूना यह है। " तो मेरे लिए यह कहता है कि बंडलर को विंडोज़ पर execjs लाइन को अनदेखा करना चाहिए।

Installing execjs (1.2.11) 

तो है कि मेरे पास कहता है कि मैं डॉक्स के बारे में कुछ याद कर रहा हूँ या बंडलर प्लेटफार्मों आदेश की अनदेखी कर रहा है: विंडोज पर लेकिन जब मैं bundle install भाग गया मैं इस देखा। क्या मुझसे कुछ गलत हो रही है? मंच स्विच के रूप में मैं इसे इस्तेमाल कभी नहीं किया है:

PS>bundle -v 
Bundler version 1.0.21 
+0

जानकारी की आवश्यकता के बिट कि Gemfile में प्लेटफार्मों रूबी के कार्यान्वयन, नहीं ओएस के लिए संदर्भित करता है। : गहरे लाल रंग का ==: सभी ओएस प्लेटफार्म पर एमआरआई ताकि आप उस उपयोग नहीं कर सकते एक ओएस या अन्य पर इंस्टॉल होने से एक रत्न को रोकने के लिए। – ffoeg

+1

डॉक्स से लाइन @ffoeg (रूबी: सी रूबी ... नहीं विंडोज़) आप – jcollum

+0

से सहमत नहीं मैं ठीक किया मानी। आपके प्रश्न का उत्तर वही रहता है। बंडलर में प्लेटफॉर्म काम करता है लेकिन यह वह तंत्र नहीं है जिसे आप इस मामले में उपयोग करना चाहते हैं। नीचे मेरा जवाब देखें। – ffoeg

उत्तर

18

:platforms => :ruby वास्तव में विंडोज पर स्थापित किए जाने से जवाहरात को बाहर करता है।

हालांकि, यह साइगविन वातावरण में काम करता है। साइगविन में, यह मंच को मानता है: श्रीमान।

आप यह भी देखेंगे कि ruby -e 'puts RUBY_PLATFORM' आउटपुट i386-cygwin, नहीं i386-mingw32 या जैसे कि यह विंडोज माणिक पर होगा i386-mswin

आप एक cygwin वातावरण में काम कर रहे थे?

+0

आवश्यकतानुसार _linux_ या _darwin_ env के लिए, जैसा कि यहां वर्णित है, ठीक से काम करता है http://stackoverflow.com/a/16475580/933358 –

+1

'ruby -e' के लिए धन्यवाद RUBY_PLATFORM ' – Paul

1

मैं के बारे में यकीन नहीं है। हालांकि, एक विकल्प जो मुझे लगता है कि आपके परिदृश्य के लिए काम करेगा, वह आपके जेमफाइल में 'समूह' ब्लॉक में उन दो रत्नों के लिए आपकी घोषणाओं को लपेटना होगा। जैसे ...

group :production do 
    gem 'therubyracer' 
    gem 'execjs' 
end 

इस तरह, उन जवाहरात केवल अपने उत्पादन वातावरण में इस्तेमाल किया जाएगा के विकास में नहीं।

ध्यान दें कि मुझे विश्वास है कि बंडलर अभी भी उन्हें विकास में स्थापित करेगा (निर्भरता जांच के साथ कुछ करने के लिए), लेकिन वे वास्तव में लोड नहीं होंगे और इसलिए समस्याएं नहीं होनी चाहिए। इस तरह Gemfile को

+1

यह काम कर सकता है लेकिन वास्तव में मेरे प्रश्न का उत्तर नहीं देता है। मैंने नहीं पूछा कि मैं इसके आसपास कैसे काम कर सकता हूं, मैंने पूछा कि क्या यह काम करना चाहिए या नहीं। – jcollum

+0

मैं मानता हूँ कि यह सवाल सीधे संबोधित नहीं करता, लेकिन यह मूल समस्या का समाधान करता है। यह "चारों ओर काम नहीं" है। यह एक समान रूप से मान्य विकल्प है कि आप के बारे में पता किया गया है नहीं हो सकता है, और आप कर सकते हैं (या नहीं हो सकता) लग रहा है अपने विशिष्ट स्थिति के लिए उपयुक्त है। –

10

जोड़ें कोड/शामिल नहीं है कि ओएस मंच

if RUBY_PLATFORM=~ /win32/ 
    gem "windows-only-gem" 
else 
    gem "os-agnostic-gem" 
end 
+0

तो दस्तावेज़ सिर्फ गलत हैं? यही वह है जो मैं वास्तव में प्राप्त करने की कोशिश कर रहा हूं। – jcollum

+5

आप अपने जेमफ़ाइल में 'if' ब्लॉक का उपयोग नहीं कर सकते। यदि आप करते हैं, तो Gemfile.lock को पुन: उत्पन्न किया जाएगा और प्रत्येक प्लेटफॉर्म पर प्रोजेक्ट तक पहुंचने पर हर बार संशोधित किया जाएगा। –

+0

तो क्या? कुछ कुत्ते की तरह लगता है कि आपको जाने देना चाहिए। हम ओएसएक्स पर देव हैं और जेआरबी में तैनात हैं। हम केवल Gemfile.lock में जांचते हैं जो जेआरबी में उत्पन्न होता है। – ffoeg

3

Bundler मंच की अवधारणा RUBY_PLATFORM मिलान या RubyGems व्यवहार के सामान्य समझ से अलग है पर निर्भर करता है जवाहरात भी शामिल है।

आप कैसे Bundler यहाँ प्लेटफार्मों का उपयोग करने के बारे में संपूर्ण प्रलेखन पा सकते हैं:

http://bundler.io/v1.14/man/gemfile.5.html

आप Windows पर therubyracer (यह वास्तव में काम नहीं करता है) की जरूरत नहीं है, लेकिन आप execjs इसलिए आवश्यकता हो सकती है CoffeeScript या एसेट पाइपलाइन ठीक से काम

के अन्य विवरणों आपके मामले में, मुझे क्या करना होगा:

gem "execjs" 
gem "therubyracer", :platforms => :ruby 

अद्यतन: execjs मणि स्थापित किया जा सकता है क्योंकि एक और निर्भरता (प्लेटफॉर्म द्वारा सीमित नहीं) इसे स्थापित करने के आधार पर है।

0
gem 'win32-security', '~> 0.3.1' if (RbConfig::CONFIG['host_os'] =~ /mswin|mingw|cygwin/) 

यह मेरे लिए बहुत अच्छा काम करता है।

+0

यह एक कामकाज है एक जवाब से। – jcollum

0

@ ffoeg के जवाब का एक बदलाव मेरे लिए काम किया, और सभी खिड़कियों वातावरण संभालती है, बस RUBY_PLATFORM=~ /win32/ का उपयोग कर, जबकि काम नहीं किया:

if RUBY_PLATFORM =~ /mswin|mingw|cygwin/i 

    gem 'windows-only' 

else 

    gem 'non-windows'  

end 

मैं मानता हूँ कि यह अलग gemfiles के लिए आदर्श नहीं है के बाद से मैं तथापि, 'unicorn का उपयोग कर Heroku पर मेरे Jekyll ब्लॉग सेवा करने के लिए हूँ, इसलिए मैं gem unicorn की जरूरत है - और इस kgio पर निर्भर करता है जो कई स्रोतों की पुष्टि की है वास्तव में खिड़कियों पर स्थापित करने के लिए असंभव है ...

0

रेल 5:

+०१२३५१६४१०६
if Gem.win_platform? 
    # Install gem for Windows 
else 
    # Install another gem 
end 
संबंधित मुद्दे