Elixir 1.7 - Introduction to Mix

मिक्स का परिचय




elixir

मिक्स का परिचय

इस गाइड में, हम सीखेंगे कि अपने स्वयं के पर्यवेक्षण वृक्ष, कॉन्फ़िगरेशन, परीक्षण और अधिक के साथ एक पूर्ण अमृत आवेदन कैसे बनाया जाए।

एप्लिकेशन वितरित की-वैल्यू स्टोर के रूप में काम करता है। हम बाल्टियों में की-वैल्यू पेयर को व्यवस्थित करने जा रहे हैं और उन बाल्टियों को कई नोड्स में वितरित करते हैं। हम एक सरल ग्राहक भी बनाएंगे जो हमें उन नोड्स में से किसी से जुड़ने और अनुरोध भेजने की अनुमति देता है:

CREATE shopping
OK

PUT shopping milk 1
OK

PUT shopping eggs 3
OK

GET shopping milk
1
OK

DELETE shopping eggs
OK

हमारे मुख्य-मूल्य अनुप्रयोग के निर्माण के लिए, हम तीन मुख्य उपकरणों का उपयोग करने जा रहे हैं:

  • ओटीपी (ओपन टेलीकॉम प्लेटफ़ॉर्म) पुस्तकालयों का एक समूह है जो एर्लैंग के साथ जहाज करता है। Erlang डेवलपर्स मजबूत, दोष-सहिष्णु अनुप्रयोगों के निर्माण के लिए OTP का उपयोग करते हैं। इस अध्याय में हम यह पता लगाएंगे कि ओटीपी के कितने पहलू एलिक्जिर के साथ एकीकृत हैं, जिनमें पर्यवेक्षण पेड़, इवेंट मैनेजर और बहुत कुछ शामिल हैं;

  • Mix एक बिल्ड टूल है जो एलिक्सिर के साथ जहाज बनाता है जो आपके एप्लिकेशन को बनाने, संकलन करने, परीक्षण करने, इसकी निर्भरता को प्रबंधित करने और बहुत कुछ करने के लिए कार्य प्रदान करता है;

  • ExUnit एक परीक्षण-इकाई आधारित ढांचा है जो ExUnit साथ जहाज करता है;

इस अध्याय में, हम मिक्स का उपयोग करके अपना पहला प्रोजेक्ट बनाएंगे और ओटीपी , मिक्स और एक्सनिट में विभिन्न विशेषताओं का पता लगाएंगे।

इस गाइड के लिए अमृत v1.6.1 या बाद के संस्करण की आवश्यकता होती है। आप अमृत के साथ अपने अमृत संस्करण की जांच कर सकते हैं - आगे elixir --version और गेटिंग स्टार्टेड गाइड के पहले अध्याय में वर्णित चरणों का पालन करके यदि आवश्यक हो तो एक और हालिया संस्करण स्थापित करें।

यदि आपके पास गाइड के कोई प्रश्न या सुधार हैं, तो कृपया चर्चा चैनल जैसे कि अमृत ​​मंच या मुद्दों पर नज़र रखने वाले तक पहुँचें। आपका इनपुट वास्तव में महत्वपूर्ण है, जिससे हमें यह सुनिश्चित करने में मदद मिल सके कि मार्गदर्शक सुलभ हैं और अद्यतित हैं!

इस गाइड में निर्मित एप्लिकेशन का अंतिम कोड इस रिपॉजिटरी में है और इसे संदर्भ के रूप में इस्तेमाल किया जा सकता है।

ईपब प्रारूप में अमृत गाइड भी उपलब्ध हैं:

हमारा पहला प्रोजेक्ट

जब आप अमृत स्थापित करते हैं, तो elixir , elixir और iex निष्पादनयोग्य प्राप्त करने के अलावा, आपको एक निष्पादन योग्य अमृत स्क्रिप्ट भी मिलती है जिसका नाम mix

कमांड लाइन से mix new को इनवाइट करके अपना पहला प्रोजेक्ट बनाएं। हम परियोजना के नाम को तर्क ( kv , इस मामले में) के रूप में पारित करेंगे, और मिक्स को बताएंगे कि हमारा मुख्य मॉड्यूल डिफ़ॉल्ट के बजाय ऑल-अपरकेस KV होना चाहिए, जो कि Kv :

$ mix new kv --module KV

मिक्स kv नाम की एक निर्देशिका बनाएगा, जिसमें कुछ फाइलें होंगी:

* creating README.md
* creating .formatter.exs
* creating .gitignore
* creating mix.exs
* creating config
* creating config/config.exs
* creating lib
* creating lib/kv.ex
* creating test
* creating test/test_helper.exs
* creating test/kv_test.exs

आइए उन उत्पन्न फ़ाइलों पर एक संक्षिप्त नज़र डालें।

नोट: मिक्स एक अमृत निष्पादन योग्य है। इसका मतलब है कि mix चलाने के लिए, आपको अपने पैट में mix और elixir निष्पादन दोनों की आवश्यकता होगी। ऐसा तब होता है जब आप अमृत स्थापित करते हैं।

परियोजना संकलन

हमारे नए प्रोजेक्ट फोल्डर ( kv ) के अंदर mix.exs नामक एक फाइल mix.exs थी और इसकी मुख्य जिम्मेदारी हमारी परियोजना को कॉन्फ़िगर करना है। आइए इसे देखें:

defmodule KV.MixProject do
  use Mix.Project

  def project do
    [
      app: :kv,
      version: "0.1.0",
      elixir: "~> 1.6-dev",
      start_permanent: Mix.env == :prod,
      deps: deps()
    ]
  end

  # Run "mix help compile.app" to learn about applications.
  def application do
    [
      extra_applications: [:logger]
    ]
  end

  # Run "mix help deps" to learn about dependencies.
  defp deps do
    [
      # {:dep_from_hexpm, "~> 0.3.0"},
      # {:dep_from_git, git: "https://github.com/elixir-lang/my_dep.git", tag: "0.1.0"},
    ]
  end
end

हमारा mix.exs दो सार्वजनिक कार्यों को परिभाषित करता है: project , जो प्रोजेक्ट कॉन्फ़िगरेशन को प्रोजेक्ट नाम और संस्करण की तरह लौटाता है, और application , जिसका उपयोग एप्लिकेशन फाइल बनाने के लिए किया जाता है।

deps नाम का एक निजी फ़ंक्शन भी है, जिसे project फ़ंक्शन से प्राप्त किया जाता है, जो हमारी परियोजना निर्भरता को परिभाषित करता है। एक अलग फ़ंक्शन के रूप में deps को परिभाषित करना आवश्यक नहीं है, लेकिन यह प्रोजेक्ट कॉन्फ़िगरेशन को ठीक रखने में मदद करता है।

मिक्स एक फ़ाइल को lib/kv.ex पर भी बनाता है जिसमें एक मॉड्यूल होता है जिसमें एक फ़ंक्शन होता है, जिसे hello कहा जाता है:

defmodule KV do
  @moduledoc """
  Documentation for KV.
  """

  @doc """
  Hello world.

  ## Examples

      iex> KV.hello()
      :world

  """
  def hello do
    :world
  end
end

यह संरचना हमारी परियोजना को संकलित करने के लिए पर्याप्त है:

$ cd kv
$ mix compile

उत्पादन होगा:

Compiling 1 file (.ex)
Generated kv app

lib/kv.ex फ़ाइल संकलित की गई थी, kv.app नाम का एक एप्लिकेशन मैनिफ़ेस्ट जनरेट किया गया था और सभी प्रोटोकॉल को समेकित किया जा रहा है जैसा कि गेटिंग स्टार्टेड गाइड में वर्णित है । सभी संकलन कलाकृतियों को _build निर्देशिका में mix.exs फ़ाइल में परिभाषित विकल्पों का उपयोग करके रखा गया है।

प्रोजेक्ट संकलित हो जाने के बाद, आप iex करके प्रोजेक्ट के अंदर एक iex सत्र शुरू कर सकते हैं:

$ iex -S mix

परीक्षण चल रहा है

मिक्स ने हमारी परियोजना परीक्षणों को चलाने के लिए उपयुक्त संरचना भी तैयार की। मिक्स प्रॉजेक्ट्स आमतौर पर <filename>_test.exs डायरेक्टरी में प्रत्येक फाइल के लिए test डाइरेक्टरी में <filename>_test.exs फाइल होने के कन्वेंशन का पालन करते हैं। इस कारण से, हम पहले से ही हमारे lib/kv.ex फ़ाइल के अनुरूप test/kv_test.exs पा सकते हैं। यह इस बिंदु पर बहुत कुछ नहीं करता है:

defmodule KVTest do
  use ExUnit.Case
  doctest KV

  test "greets the world" do
    assert KV.hello() == :world
  end
end

कुछ बातों पर ध्यान देना जरूरी है:

  1. परीक्षण फ़ाइल एक अमृत स्क्रिप्ट फ़ाइल ( .exs ) है। यह सुविधाजनक है क्योंकि हमें उन्हें चलाने से पहले परीक्षण फ़ाइलों को संकलित करने की आवश्यकता नहीं है;

  2. हम KVTest नामक एक परीक्षण मॉड्यूल को परिभाषित करते हैं, परीक्षण एपीआई को इंजेक्ट करने के लिए ExUnit.Case का उपयोग करें और test/2 मैक्रो का उपयोग करके एक साधारण परीक्षण को परिभाषित करें;

मिक्स ने test/test_helper.exs नामक एक फ़ाइल भी तैयार की है जो टेस्ट फ्रेमवर्क स्थापित करने के लिए जिम्मेदार है:

ExUnit.start()

हमारे परीक्षण चलाने से पहले हर बार मिक्स द्वारा इस फाइल की आवश्यकता होगी। हम mix test साथ परीक्षण चला सकते हैं:

Compiled lib/kv.ex
Generated kv app
..

Finished in 0.04 seconds
1 doctest, 1 test, 0 failures

Randomized with seed 540224

ध्यान दें कि mix test चलाकर, मिक्स ने सोर्स फाइल्स को संकलित किया है और एक बार फिर से एप्लिकेशन मैनिफ़ेस्ट जेनरेट किया है। ऐसा इसलिए होता है क्योंकि मिक्स कई वातावरणों का समर्थन करता है, जिसकी चर्चा हम इस अध्याय में बाद में करेंगे।

इसके अलावा, आप देख सकते हैं कि ExUnit प्रत्येक सफल परीक्षण के लिए एक डॉट प्रिंट करता है और स्वचालित रूप से परीक्षण भी यादृच्छिक करता है। आइए उद्देश्य पर परीक्षण को विफल करें और देखें कि क्या होता है।

test/kv_test.exs में निम्नलिखित में परिवर्तन करें:

assert KV.hello() == :oops

अब फिर से mix test चलाएं (ध्यान दें कि इस बार कोई कंपटीशन नहीं होगा):

  1) test greets the world (KVTest)
     test/kv_test.exs:5
     Assertion with == failed
     code:  assert KV.hello() == :oops
     left:  :world
     right: :oops
     stacktrace:
       test/kv_test.exs:6: (test)

.

Finished in 0.05 seconds
1 doctest, 1 test, 1 failure

प्रत्येक विफलता के लिए, ExUnit एक विस्तृत रिपोर्ट प्रिंट करता है, जिसमें परीक्षण मामले के साथ परीक्षण नाम होता है, जो कोड विफल हुआ और == ऑपरेटर के बाईं ओर और दाईं ओर (rhs) के लिए मान।

परीक्षण नाम के ठीक नीचे विफलता की दूसरी पंक्ति में, वह स्थान है जहां परीक्षण को परिभाषित किया गया था। यदि आप फ़ाइल और लाइन नंबर सहित पूरी तरह से परीक्षण स्थान को कॉपी करते हैं, और इसे mix test लिए जोड़ते हैं, तो मिक्स लोड होगा और केवल उस विशेष परीक्षण को चलाएगा:

$ mix test test/kv_test.exs:5

यह शॉर्टकट बेहद उपयोगी होगा क्योंकि हम अपनी परियोजना का निर्माण करते हैं, जिससे हमें एक ही परीक्षण चलाकर जल्दी से पुनरावृति की अनुमति मिलती है।

अंत में, स्टैकट्रेस स्वयं की विफलता से संबंधित है, परीक्षण के बारे में जानकारी देता है और अक्सर स्रोत फ़ाइलों के भीतर से विफलता उत्पन्न हुई थी।

स्वचालित कोड स्वरूपण

mix new द्वारा उत्पन्न फ़ाइलों में से एक .formatter.exs । एक कोड फॉर्मेटर के साथ अमृत जहाज जो सुसंगत शैली के अनुसार हमारे कोडबेस को स्वचालित रूप से प्रारूपित करने में सक्षम है। फ़ॉर्मेट को mix format कार्य के साथ ट्रिगर किया जाता है। उत्पन्न .formatter.exs फ़ाइल कॉन्फ़िगर करती है कि mix format चलने पर कौन सी फाइलें फॉर्मेट की जानी चाहिए।

फ़ॉर्मेटर को आज़माने के लिए, अतिरिक्त रिक्त स्थान या अतिरिक्त newlines, जैसे कि def hello do , और फिर mix format चलाने के लिए lib या test निर्देशिकाओं में फ़ाइल बदलें।

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

कंपनियों और टीमों के लिए, हम डेवलपर्स को अपने निरंतर एकीकरण सर्वर पर mix format --check-formatted चलाने की सलाह देते हैं, यह सुनिश्चित करता है कि सभी वर्तमान और भविष्य के कोड मानक का पालन करें।

आप प्रारूप कार्य प्रलेखन की जांच करके या एलिक्जिर v1.6 के लिए रिलीज की घोषणा को पढ़कर कोड फॉर्मेटर के बारे में अधिक जान सकते हैं, फॉर्मेटर को शामिल करने वाला पहला संस्करण।

वातावरण

मिक्स "वातावरण" की अवधारणा प्रदान करता है। वे एक डेवलपर को विशिष्ट परिदृश्यों के लिए संकलन और अन्य विकल्पों को अनुकूलित करने की अनुमति देते हैं। डिफ़ॉल्ट रूप से, मिक्स तीन वातावरण को समझता है:

  • :dev - वह जिसमें मिक्स कार्य (जैसे compile ) डिफ़ॉल्ट रूप से चलते हैं
  • :test - mix test द्वारा उपयोग किया जाता है
  • :prod - वह जिसे आप उत्पादन में अपनी परियोजना को चलाने के लिए उपयोग करेंगे

पर्यावरण केवल वर्तमान परियोजना पर लागू होता है। जैसा कि हम भविष्य के अध्यायों में देखेंगे, आप अपनी परियोजना में किसी भी निर्भरता को डिफ़ॉल्ट रूप से चलाएंगे :prod वातावरण।

प्रति वातावरण का अनुकूलन आपके mix.exs फ़ाइल में Mix.env फ़ंक्शन तक Mix.env किया जा सकता है, जो एक परमाणु के रूप में वर्तमान वातावरण को लौटाता है। यही हमने प्रयोग किया है :start_permanent विकल्प:

def project do
  [
    ...,
    start_permanent: Mix.env == :prod,
    ...
  ]
end

जब सही हो, तो :start_permanent विकल्प आपके आवेदन को स्थायी मोड में शुरू करता है, जिसका अर्थ है कि यदि आपके एप्लिकेशन का पर्यवेक्षण ट्री शट डाउन हो जाता है तो :start_permanent वीएम क्रैश हो जाएगा। ध्यान दें कि हम इस व्यवहार को देव और परीक्षण में नहीं चाहते हैं क्योंकि यह समस्या निवारण के लिए उन वातावरणों में VM उदाहरण को रखने के लिए उपयोगी है।

मिक्स डिफ़ॉल्ट हो जाएगा :dev वातावरण, test कार्य को छोड़कर जो कि डिफ़ॉल्ट होगा :test वातावरण। पर्यावरण को MIX_ENV पर्यावरण चर के माध्यम से बदला जा सकता है:

$ MIX_ENV=prod mix compile

या विंडोज पर:

> set "MIX_ENV=prod" && mix compile

मिक्स एक बिल्ड टूल है और जैसे, यह हमेशा उत्पादन में उपलब्ध होने की उम्मीद नहीं है, खासकर अगर आपकी टीम स्पष्ट बिल्ड चरणों का उपयोग करती है। इसलिए, यह केवल विन्यास फाइल और mix.exs में Mix.env को एक्सेस करने की सिफारिश की जाती है, आपके एप्लिकेशन कोड ( mix.exs में कभी नहीं।

तलाश

मिक्स के लिए बहुत कुछ है, और हम अपनी परियोजना का निर्माण करते हुए इसे तलाशते रहेंगे। Mix एक Mix मिक्स सोर्स कोड यहां पढ़ें।

ध्यान रखें कि आप सभी उपलब्ध कार्यों को सूचीबद्ध करने के लिए हमेशा मदद कार्य को लागू कर सकते हैं:

$ mix help

आप किसी विशेष कार्य के बारे में और जानकारी प्राप्त कर सकते हैं।

कुछ कोड लिखते हैं!