एलिक्सिर एप्लिकेशन कैसे चलाएं?


84

एलिक्सिर एप्लिकेशन चलाने का सही तरीका क्या है?

मैं एक साधारण परियोजना बना रहा हूँ:

mix new app

और उसके बाद मैं कर सकता हूँ:

mix run

जो मूल रूप से एक बार मेरे ऐप को संकलित करता है। इसलिए जब मैं जोड़ता हूं:

IO.puts "running"

में lib/app.exमैं देख रहा हूँ "running"केवल पहली बार के लिए, प्रत्येक लगातार runजब तक कि वहाँ कुछ परिवर्तन कर रहे हैं कुछ नहीं करता है। मैं उत्पन्न के साथ आगे क्या कर सकता हूं app.app?

बेशक मुझे पता है कि मैं कर सकता हूँ:

escript: [main_module: App]

में mix.exs, प्रदान करें def main(args):और फिर:

mix escript.build
./app

लेकिन यह मेरी राय में थोड़े बोझिल है।

वहाँ भी कुछ इस तरह है:

elixir lib/app.exs

लेकिन यह mix.exsस्पष्ट रूप से नहीं गिना जाता है, जो मेरे में निर्भरता के लिए आवश्यक है app


2
यदि आप एक एलिक्सिर स्क्रिप्ट (एक .exsफ़ाइल) चलाना चाहते हैं, लेकिन अपने मिक्स ऐप के संदर्भ में ऐसा करें, तो आप चला सकते हैं mix run <script>mix help runअधिक जानकारी के लिए देखें ।
मिशेल टाइली

जवाबों:


106

mix runअपना ऐप चलाता है। यह सिर्फ इतना है कि जब आप बस IO.puts "something"एक फ़ाइल में डालते हैं तो उस लाइन का केवल संकलन-समय में मूल्यांकन किया जाता है, यह रनटाइम पर कुछ भी नहीं करता है। यदि आप कुछ शुरू करना चाहते हैं, जब आप अपना ऐप शुरू करते हैं तो आपको यह निर्दिष्ट करने की आवश्यकता होती है कि आपके में mix.exs

आमतौर पर आप एक शीर्ष-स्तर चाहते हैं जो Applicationशुरू हो जाएगा। इसे प्राप्त modकरने के लिए अपने लिए एक विकल्प जोड़ें mix.exs:

def application do
  [
    # this is the name of any module implementing the Application behaviour
    mod: {NewMix, []},
    applications: [:logger]
  ]
end

और फिर उस मॉड्यूल में आपको एक कॉलबैक लागू करने की आवश्यकता होती है जिसे एप्लिकेशन प्रारंभ पर बुलाया जाएगा:

defmodule NewMix do
  use Application

  def start(_type, _args) do
    IO.puts "starting"
    # some more stuff
  end
end

startकॉलबैक वास्तव में अपने उच्च-स्तरीय प्रक्रिया या पर्यवेक्षण पेड़ जड़ सेटअप लेकिन इस मामले में आप पहले से ही देखेंगे चाहिए कि यह हर बार जब आप का उपयोग कहा जाता है mix run, हालांकि एक त्रुटि हुई।

def start(_type, _args) do
  IO.puts "starting"
  Task.start(fn -> :timer.sleep(1000); IO.puts("done sleeping") end)
end

इस मामले में हम अपने कॉलबैक में एक सरल प्रक्रिया शुरू कर रहे हैं जो सिर्फ एक सेकंड के लिए सोती है और फिर कुछ आउटपुट करती है - यह startकॉलबैक के एपीआई को संतुष्ट करने के लिए पर्याप्त है लेकिन हम नहीं देखते हैं "done sleeping"। इसका कारण यह है कि डिफ़ॉल्ट रूप mix runसे एक बार बाहर निकल जाएगा जब कॉलबैक ने निष्पादन समाप्त कर दिया है। ऐसा नहीं होने के लिए आपको उपयोग करने की आवश्यकता नहीं है mix run --no-halt- इस मामले में वीएम को रोका नहीं जाएगा।

अपना आवेदन शुरू करने का एक और उपयोगी तरीका है iex -S mix- यह एक समान तरीके से व्यवहार करेगा, mix run --no-haltलेकिन एक iexखोल भी खोल सकता है जहां आप अपने कोड और अपने चल रहे एप्लिकेशन के साथ बातचीत कर सकते हैं।


5
ठीक है, यह लगभग मुझे क्या चाहिए! एक और बात, तो आप इस व्याख्या कर सकते हैं returned a bad value: :okत्रुटि कब वहां नहीं Task, या Agentया Supervisorआदि? यह कैसे काम करता है और हमें एक अलग प्रक्रिया की आवश्यकता क्यों है? मैं कुछ स्क्रिप्ट क्यों नहीं चला सकता, जो मुझे चाहिए
कामिल लेलोनेक

19
एक आवेदन कॉलबैक को एक पर्यवेक्षण पेड़ वापस करना होगा। यदि आप एक को वापस नहीं करते हैं, तो यह विफल हो जाएगा। वास्तव में, मैं भी Paweł द्वारा दिखाए गए पिछले अभिव्यक्ति की जगह लेंगे Supervisor.start_link [], strategy: :one_for_one:। सोते समय एक कार्य को वापस करने के कारण आवेदन विफल हो सकता है।
जोस वैलिम

1
@squixy उपयोग और परिभाषित अनुप्रयोगों के कुछ लाभों की रूपरेखा यहाँ दी गई है: stackoverflow.com/questions/30422184/…
जोस वेलिम

2
यदि आप किसी भी तरह के लंबे समय तक चलने वाले एप्लिकेशन का निर्माण कर रहे हैं, तो आप लगभग हमेशा चाहते हैं Supervisor। मैंने एक Taskछोटे से सही कार्यक्रम का उपयोग किया, लेकिन जैसा कि जोस ने उल्लेख किया है - आप वहां अपना पर्यवेक्षण वृक्ष शुरू करना चाहते हैं।
पावेल ओबर्क

1
बहुत बढ़िया जवाब! हालांकि एक सवाल। आपने लिखा "यह सिर्फ इतना है कि जब आप बस IO.puts "something"एक फ़ाइल में डालते हैं , तो उस लाइन का केवल संकलन-समय में मूल्यांकन किया जाता है, यह समय पर कुछ भी नहीं करता है।" जो मुझे दिखाई दे रहा है, उससे मेल खाता है, लेकिन मुझे इसके तर्क समझ में नहीं आते हैं? यह उस तरह से काम क्यों करता है?
user2104969

10

आप Mix.Taskइसके बजाय अपने मॉड्यूल में आयात करके कार्य चला सकते हैं mix run

मुझे लगता है कि यह आप के लिए क्या देख रहे है।

इसके बजाय mix <task.run>, आप mixडिफ़ॉल्ट कार्य को चलाने के लिए बस चला सकते हैं । सीधे शब्दों में जोड़ने default_task: "bot.run"की सूची में def project do [..] endमें mix.exsयहाँ देखें ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.