2012-05-08 17 views
5

मेरे पास मेरे क्लस्टर में कुछ ऐप्स हैं, मुझे कभी-कभी अलग-अलग होस्टों में से कुछ शुरू करने की आवश्यकता है।एरलांग, अपनी निर्भरताओं के साथ अनुप्रयोगों को कैसे लोड करें

कहानी यह है कि एरलांग क्लस्टर पहले से चल रहा है, भले ही मेरे पास प्रति एप्लिकेशन मेरी .app संसाधन फ़ाइल है, यह बताते हुए कि मेरे सामने कौन से एप्लिकेशन शुरू किए जाएंगे, यह केवल स्टार्टअप स्क्रिप्ट बनाने के लिए काम करता है, ऐप शुरू नहीं करने के लिए पहले से चल रहे नोड में।

इस समय मेरे पास एक कस्टम दिनचर्या है जो आवेदन का उपयोग करती है: get_key (एप्लिकेशन, एप्लिकेशन) निर्भरता निकालने के लिए और दिए गए एप्लिकेशन को शुरू करने से पहले उन्हें अलग से शुरू करें।

मैं सोच रहा था कि ऐसा करने का कोई बेहतर तरीका नहीं है।

उत्तर

1

स्टार्टअप स्क्रिप्ट के बाहर ऐप शुरू करते समय आपको पहले निर्भरताएं शुरू करने की आवश्यकता होती है। आप ऐप में ऐसा करने के लिए स्मारक बना सकते हैं ताकि जब ऐप शुरू होता है तो इससे पहले किसी भी आवश्यक निर्भरता की आवश्यकता होती है।

एक जगह मैंने इसे देखा है Mochiweb ऐप्स में है। डिफ़ॉल्ट app templates स्टार्टअप पर लोड हो रहा है निर्भरता के लिए कोड में शामिल हैं:

-module(some_app). 
-export([start/0, stop/0]). 

ensure_started(App) -> 
    case application:start(App) of 
     ok -> 
      ok; 
     {error, {already_started, App}} -> 
      ok 
    end. 

%% @spec start() -> ok 
%% @doc Start the some_app server. 
start() -> 
    some_app_deps:ensure(), 
    ensure_started(crypto), 
    application:start(some_app). 

%% @spec stop() -> ok 
%% @doc Stop the some_app server. 
stop() -> 
    application:stop(some_app). 
0

आप "OTP डिजाइन सिद्धांत 'के तहत अपने अनुप्रयोग लिखने हैं, तो आप yourappname.app फ़ाइल है, जो होगा` अनुप्रयोगों' अनुभाग में शामिल करना होगा। यह खंड परिभाषित करता है कि आप कौन से अन्य अनुप्रयोगों को शुरू करना चाहते हैं। Here कहा गया है:

अनुप्रयोगों

सभी आवेदनों जो पहले इस आवेदन शुरू कर दिया है शुरू कर दिया जाना चाहिए। सिस्टूल इस सूची का उपयोग सही बूट स्क्रिप्ट उत्पन्न करने के लिए करता है। [] पर डिफ़ॉल्ट, लेकिन ध्यान दें कि कम से कम कर्नेल और stdlib के लिए सभी अनुप्रयोगों में निर्भरताएं हैं।

तो यदि आप रिलीज का उपयोग करते हैं, तो यह निर्भरता संकल्प systools द्वारा हल किया जाएगा।

+1

मुझे लगता है कि यह केवल यह सुनिश्चित करता है कि सभी 'एप्लिकेशन' निर्भरता शुरू होने से पहले आपका ऐप प्रारंभ नहीं हुआ है, लेकिन वास्तव में उन्हें प्रारंभ नहीं करता है। – nietaki

6

सचमुच, एरलांग में ऐसा करने के लिए मानक उपकरण अभी अनावश्यक रूप से परेशान हैं। मैं अपने आवेदन कॉलबैक मॉड्यूल में निम्नलिखित बॉयलर-प्लेट डाल करने के लिए करते हैं:

-module(myapp_app). 
-export([start/0]). 

start() -> a_start(myapp, permanent). 

a_start(App, Type) -> 
    start_ok(App, Type, application:start(App, Type)). 

start_ok(_App, _Type, ok) -> ok; 
start_ok(_App, _Type, {error, {already_started, _App}}) -> ok; 
start_ok(App, Type, {error, {not_started, Dep}}) -> 
    ok = a_start(Dep, Type), 
    a_start(App, Type); 
start_ok(App, _Type, {error, Reason}) -> 
    erlang:error({app_start_failed, App, Reason}). 

तब आप अपने erlang कमांड लाइन के लिए -s myapp_app जोड़ सकते हैं और इस रिकर्सिवली एप्लिकेशन और उसके सभी निर्भरता शुरू कर देंगे। मैं नहीं जानता कि क्यों इस समारोह आवेदन मॉड्यूल में नहीं है :)


मेरी Erlang फैक्टरी 2012 SFBay उदाहरण अनुप्रयोग में इस custom erlang app startup code की एक काम उदाहरण है।

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