2011-04-29 11 views
17

पर सिनात्रा कॉन्फ़िगर करने वाले वातावरण मैंने एक छोटे सिनात्रा एप्लिकेशन को सफलतापूर्वक लिखा है और इसे पहले से ही सफलतापूर्वक इसे हीोकू पर तैनात किया है।फ्लाई

हालांकि मैं अपने स्थानीय कंप्यूटर पर विकास मोड में उस एप्लिकेशन को चलाने के लिए चाहता हूं और मैं इसे रिमोट रिपोजिटरी पर धक्का देने के बाद इसे अपनेोकू पर उत्पादन मोड बनाना चाहता हूं।

वर्तमान में मैं या तो विकल्पों में से एक प्राप्त कर सकता हूं। जब मैं निम्न मान के लिए मेरे config.ru बदलने के लिए:

require 'rubygems' 
require 'sinatra' 
require 'sinatra/reloader' 
require "./calc.rb" 

enable :logging 
set :environment, :development 
set :port, 4567 

मैं ruby config.ru के माध्यम से स्थानीय स्तर पर इसे चलाने के लिए (पोर्ट 4567 पर) में सक्षम हूँ। जब मैं यह करने के लिए config.ru बदलने के लिए:

require 'rubygems' 
require 'sinatra' 
require 'sinatra/reloader' 
require "./calc.rb" 

enable :logging 
set :environment, :production 
set :port, 4567 
run Sinatra::Application 

मैं इसे (पोर्ट 80 पर) Heroku पर चलाने के लिए प्राप्त करने में सक्षम हूँ।

लेकिन मैं विकास और उत्पादन दोनों के लिए एक ही कॉन्फ़िगरेशन का उपयोग नहीं कर सकता।

उत्पादन के लिए विकास के लिए ruby config.ru dev और ruby config.ru:

मैं की तरह कुछ करना चाहते हैं।

अतिरिक्त जानकारी:

जब मैं अपने स्थानीय मशीन पर उत्पादन config.ru चलाने का प्रयास मैं:

$ ruby config.ru 
(eval):2:in `method_missing': undefined method `run' for main:Object (NoMethodError) 
     from (eval):4:in `__send__' 
     from (eval):4:in `method_missing' 
     from config.ru:10 

उत्तर

20

यदि आप पर्यावरण निर्दिष्ट नहीं करते हैं, तो development डिफ़ॉल्ट रूप से उपयोग किया जाता है। आप जो भी पर्यावरण नाम चाहते हैं उसे निर्दिष्ट कर सकते हैं, हालांकि 'उत्पादन' बहुत आम है। यदि आप एक ऐसा वातावरण निर्दिष्ट करते हैं जिसे आप कॉन्फ़िगर नहीं करते हैं, तो कोई कॉन्फ़िगरेशन ब्लॉक मेल नहीं खाएगा। (यह आपके हिस्से पर एक गलती हो सकती है, लेकिन यह कोड द्वारा पकड़ा गया त्रुटि नहीं है।)

ध्यान दें कि सिनात्रा दस्तावेज कहता है कि setting RACK_ENV environment variable will be used if available। यह काम नहीं करता था, लेकिन पिछले कुछ सालों में कुछ समय तय हो गया है!

यदि, उदाहरण के लिए, आप अपनी सेवा के लिए एक पर्यावरण चर सेट कर सकते हैं, तो आप मोड को नियंत्रित कर सकते हैं।

+2

RACK_ENV चीज सिर्फ खिड़कियां नहीं है, वही होता है मेरे मैक पर मेरे लिए। दिलचस्प बात यह है कि पिछले साल से रैक में एक [ठीक है] [https://github.com/rack/rack/commit/32de46c139e10dc2261ca63a3049e98e310d0781) लगता है लेकिन इसने इसे मणि में नहीं बनाया है। रैक RACK_ENV को जो भी आप '-E' के साथ निर्दिष्ट करते हैं और' विकास 'के लिए डिफ़ॉल्ट रूप से सेट करता है और सिनात्रा को यह देखना चाहिए। – matt

-1

Heroku प्रलेखन पर देखो:

http://devcenter.heroku.com/articles/rack#frameworks

यह मूल रूप से मैं अपने ऐप के लिए उपयोग करता हूं, जब मैं इसे स्थानीय रूप से शुरू करता हूं तो यह पोर्ट 4567 पर चलता है।

+0

क्या मुझे अपनी स्थानीय मशीन पर कुछ और चाहिए, क्योंकि मेरे पास लाइन रन सिनात्रा नहीं है :: config.ru में आवेदन (ऊपर उल्लिखित त्रुटि फेंक दी गई है) – leifg

5

आप अपने config.ru में ENV['RACK_ENV'] भी पकड़ सकते हैं और अपने ऐप को अलग-अलग कॉन्फ़िगर कर सकते हैं। हेरोकू पर को डिफ़ॉल्ट रूप से उत्पादन में चलाया जाना चाहिए और यदि आप अपने सर्वर को आग लगाने के लिए rackup डिफ़ॉल्ट रूप से विकास करेंगे।

#\ -p 4567 
require 'bundler'    # gem requires 
Bundler.require(:default, ENV['RACK_ENV'].to_sym) # only loads environment specific gems 
if ENV['RACK_ENV'] == 'production'   # production config/requires 
    require './lib/middleware/exceptionmailer' 

    use Rack::ExceptionMailer, 
    :to => ['[email protected]'], 
    :from => '[email protected]', 
    :subject => 'Error Occurred on Rack Application' 

else       # development or testing only 
    use Rack::ShowExceptions 
end 

इस तरह, पतला या यात्री या जो कुछ भी यह लेने जाएगा और सही मॉड्यूल उत्पादन लेकिन आप में लोड हो जाएगा: यहाँ मेरी ऐप्स से कुछ नमूना कोड है कि एक ही कॉन्फ़िग फ़ाइल के साथ दोनों परिवेशों में चलाता है विकास के लिए अन्य विन्यास कर सकते हैं।

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