2010-04-07 14 views
6

मेरे पास Sinatra::Base में संलग्न एक सिनात्रा एप्लिकेशन है और सर्वर शुरू होने के बाद मैं कुछ कोड चलाने के लिए चाहता हूं, मुझे यह करने के बारे में कैसे जाना चाहिए?सिनात्रा सर्वर चल रहा है एक बार कोड निष्पादित करें

require 'sinatra' 
require 'launchy' 

class MyServer < Sinatra::Base 
    get '/' do 
    "My server" 
    end 

    # This is the bit I'm not sure how to do 
    after_server_running do 
    # Launches a browser with this webapp in it upon server start 
    Launchy.open("http://#{settings.host}:#{settings.port}/") 
    end 
end 

कोई भी विचार:

यहाँ एक उदाहरण है?

+0

आप कुछ मदद पाने के लिए और अधिक विशिष्ट होने की जरूरत हो सकती है। – Beanish

+0

आप सही तरीके से सही हैं - मैंने सोचा कि यह आत्म-व्याख्यात्मक था! देखते हैं कि ये संशोधन –

+1

में कैसे मदद करते हैं, यह वह नहीं है जिसे आपने पूछा था, लेकिन आपको 'सिनात्रा' आधार की आवश्यकता नहीं है, न कि 'साइनत्रा'। Http://www.sinatrarb.com/intro.html#Sinatra::Base%20-%20Middleware,%20 पुस्तकालय ,%20and%20Modular%20Apps: "आपकी फ़ाइल को sinatra के बजाय sinatra/base की आवश्यकता होनी चाहिए; अन्यथा, सभी सिनात्रा के डीएसएल तरीकों का मुख्य नामस्थान में आयात किया जाता है। " – mwp

उत्तर

4

कॉन्फ़िगरेशन ब्लॉक का उपयोग करना ऐसा करने का सही तरीका नहीं है। जब भी आप फ़ाइल लोड करते हैं तो आदेश चलाए जाएंगे।

प्रयास का विस्तार run!

require 'sinatra' 
require 'launchy' 

class MyServer < Sinatra::Base 

    def self.run! 
    Launchy.open("http://#{settings.host}:#{settings.port}/") 
    super 
    end 

    get '/' do 
    "My server" 
    end 
end 
+2

यदि आप चाहते हैं कि आपका कोड _after_ स्टार्टअप चलाए, तो आप विधि में पहले 'सुपर' पर कॉल करना चाहेंगे। – matt

+1

इसके अलावा, यह सर्वर प्रारंभ होने के बाद आपके कोड को चलाने के लिए 'कॉन्फ़िगरेशन' ब्लॉक का उपयोग करने से बेहतर है, लेकिन केवल सर्वर में निर्माण के लिए काम करेगा - यदि आप उदाहरण का उपयोग करते हैं तो यह काम नहीं करेगा। 'रैकअप' या 'पतली शुरुआत'। – matt

+0

@matt वास्तव में यदि आप सुपर के बाद लॉन्च्य को कॉल करते हैं तो यह कभी नहीं पहुंचाया जाएगा, मैंने कोशिश की। settings.host भी काम नहीं कर रहा था, मैंने इसे स्थानीयहोस्ट में बदल दिया क्योंकि मैं इसे केवल स्थानीय रूप से उपयोग कर रहा हूं। –

2

यह कैसे मैं यह कर रहा है; मूल रूप से या तो सिनात्रा या एक अलग थ्रेड में अन्य कोड चलाने:

require 'sinatra/base' 

Thread.new { 
    sleep(1) until MyApp.settings.running? 
    p "this code executes after Sinatra server is started" 
} 
class MyApp < Sinatra::Application 
    # ... app code here ... 

    # start the server if ruby file executed directly 
    run! if app_file == $0 
end 
0

इस सवाल का stackoverflow में ही मान्य जवाब (जो 3-4 बार पूछा जाता है) Start and call Ruby HTTP server in the same script पर levinalex द्वारा दिया जाता है, और मैं बोली:

run! in current Sinatra versions ऐप शुरू होने पर कॉल किया जाता है जिसे एक ब्लॉक लेता है।

कि कॉलबैक का उपयोग करके आप यह कर सकते हैं:

require 'thread' 

def sinatra_run_wait(app, opts) 
    queue = Queue.new 
    thread = Thread.new do 
    Thread.abort_on_exception = true 
    app.run!(opts) do |server| 
     queue.push("started") 
    end 
    end 
    queue.pop # blocks until the run! callback runs 
end 

sinatra_run_wait(TestApp, :port => 3000, :server => 'webrick') 

यह WEBrick के लिए विश्वसनीय प्रतीत हो रहा है, लेकिन पतला का उपयोग करते समय कॉलबैक अब भी कभी कभी एक छोटा सा कहा जाता है से पहले सर्वर कनेक्शन स्वीकार करता है।

1

आप रैक (जो आप शायद कर रहे हैं) उपयोग कर रहे हैं मैं सिर्फ पता चला कि वहाँ एक समारोह आप config.ru में कॉल कर सकते हैं (यह तकनीकी रूप से Rack::Builder का एक उदाहरण विधि है) देता है कि आप सर्वर के बाद कोड का एक खंड चलाने है शुरू कर दिया गया है। यह warmup कहा जाता है, और यहाँ प्रलेखित के उपयोग का उदाहरण है:

warmup do |app| 
    client = Rack::MockRequest.new(app) 
    client.get('/') 
end 

use SomeMiddleware 
run MyApp 
+0

यह मूल प्रश्न में Launchy.open() कॉल के साथ वास्तव में अच्छा काम करता है। यद्यपि यह संभवतः एनवीवी ['RACK_ENV'] == "विकास" की जांच करना एक अच्छा विचार है क्योंकि आप संभवतः यह उत्पादन में नहीं चाहते हैं। – dwkns

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