Do you want to pick up from where you left of?
Take me there

মিক্স

এলিক্সির নিয়ে আরও গভীরে যাওয়ার আগে আমাদের “মিক্স” সম্পর্কে জানা উচিত। যদি আপনি রুবীর সাথে পরিচিত হয়ে থাকেন তাহলে মিক্সকে ধরে নিতে পারেন বান্ডলার, রুবী-জেম ও রেইকের সমন্বয় হিসেবে। যে কোন এলিক্সির প্রজেক্টের জন্য এটি অত্যন্ত গুরুত্বপূর্ণ এবং এই অধ্যায়ে আমরা মিক্সের বিশাল ফাংশনালিটির মধ্যে কতিপয় কিছু নিয়ে আলোচনা করব। মিক্স সংক্রান্ত অন্যান্য বিষয় জানতে রান করুন mix help

এই পর্যন্ত আমরা শুধুমাত্র iex নিয়ে আমাদের কাজ চালিয়ে নিয়েছি, কিন্তু iex এর কিছু লিমিটেশন রয়েছে। বড় কিছু তৈরি করতে আমাদের কোডকে ভাগ করে নিতে হবে অনেকগুলি ফাইলে, সহজতর ব্যবস্থাপনার জন্যে। মিক্স দিয়ে ঠিক সেই কাজটিই করা যায়।

নতুন প্রজেক্ট

যখন আমরা নতুন একটি এলিক্সির প্রজেক্ট শুরু করতে চাই, তা আমরা mix new চালিয়ে শুরু করব। এতে করে সৃষ্টি হবে আমাদের প্রজেক্টের ফোল্ডার কাঠামো ও অন্যান্য বয়লারপ্লেট। তো শুরু করা যাক-

mix new example

আউটপুট থেকে দেখছি যে মিক্স একটি নতুন ফোল্ডার ও কিছু ফাইল বানিয়েছে-

* creating README.md
* creating .gitignore
* creating .formatter.exs
* creating mix.exs
* creating lib
* creating lib/example.ex
* creating test
* creating test/test_helper.exs
* creating test/example_test.exs

আমরা একটু mix.exs ফাইলটি খুলে দেখি। এই ফাইলটির মাধ্যমে আমরা আমাদের অ্যাপ্লিকেশান, ডিপেন্ডেন্সি, এনভারনমেন্ট ও ভার্সন কনফিগার করে থাকি। ফাইলটির কন্টেন্ট নীচে দেখানো হয়েছে (কমেন্ট সরিয়ে দেয়া হয়েছে সংক্ষিপ্ততার জন্য)-

defmodule Example.Mix do
  use Mix.Project

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

  def application do
    [
      extra_applications: [:logger]
    ]
  end

  defp deps do
    []
  end
end

প্রথম সেকশন হল project। এখানে আমরা আমাদের অ্যাপ্লিকেশানের নাম (app), ভার্সন (version), এলিক্সিরের ভার্সন (elixir) এবং ডিপেন্ডেন্সি (deps) বলে থাকি।

ইন্টার‍্যাক্টিভ

আমাদের অ্যাপ্লিকেশানের প্রেক্ষিতে iex ব্যবহার করা লাগতে পারে। মিক্স দিয়ে এটি সহজেই করা যায়।

iex -S mix

এভাবে iex শুরু করলে তা আপনার অ্যাপ্লিকেশান এবং ডিপেন্ডেন্সি সমেত শুরু হবে।

কম্পাইলেশান

মিক্স বেশ স্মার্ট এবং তা আপনার প্রজেক্টকে দরকারমত কম্পাইল করে নিবে, কিন্তু অনেক সময়ে হয়ত আপনাকে নিজ থেকে কম্পাইল করতে হতে পারে। এই সেকশনে আমরা আলোচনা করব কিভাবে প্রজেক্টকে কম্পাইল করতে হয় এবং ওই কম্পাইলেশান কী করে?

একটি মিক্স প্রজেক্টকে কম্পাইল করতে হলে আমাদের বেইস ফোল্ডারে গিয়ে mix compile রান করতে হবে।

mix compile

যেহেতু প্রজেক্টে আমরা তেমন কিছু করিনি তাই আউটপুট তেমন আহামরি কিছু না, তবে কম্পাইল ঠিক মতই হবে-

Compiled lib/example.ex
Generated example app

যখন আমরা কোন প্রজেক্ট কম্পাইল করি তখন মিক্স _build নামক একটি ফোল্ডার সৃষ্টি করে এবং সমস্ত আর্টিফ্যাক্ট সেখানে সেভ করে। ওই ফোল্ডারটি খুললে আমরা আমাদের কম্পাইলকৃত অ্যাপ্লিকেশানটি দেখতে পাব- example.app.

ডিপেন্ডেন্সি ম্যানেজমেন্ট

আমাদের প্রজেক্টটির কোন ডিপেন্ডেন্সি নেই তাই এখন আমরা কিছু ডিপেন্ডেন্সি উল্লেখ করব। ডিপেন্ডেন্সি বানিয়ে ডাউনলোড করার পদ্ধতি নিয়ে এবার কথা বলি।

ডিপেন্ডেন্সি যোগ করতে হলে প্রথমে আমরা আমাদের mix.exs এর deps সেকশনে তা যোগ করি। আমাদের ডিপেন্ডেন্সি লিস্ট হচ্ছে টাপলের সমন্বয়ে তৈরি একটি লিস্ট, যেখানে প্রতিটি টাপল একটি ডিপেন্ডেন্সি যার প্রথম এলিমেন্ট হল প্যাকেজের নাম (অ্যাটম হিসেবে), দ্বিতীয়টি হল ওই প্যাকেজটির ভার্সন। তৃতীয় ও অপশনাল আরেকটি এলিমেন্ট থাকতে পারে যা অতিরিক্ত তথ্য উল্লেখে ব্যবহৃত হয়।

চলুন একটি প্রজেক্টের (phoenix_slim) ডিপেন্ডেন্সি দেখে নেই -

def deps do
  [
    {:phoenix, "~> 1.1 or ~> 1.2"},
    {:phoenix_html, "~> 2.3"},
    {:cowboy, "~> 1.0", only: [:dev, :test]},
    {:slime, "~> 0.14"}
  ]
end

বুঝাই যাচ্ছে যে cowboy ডিপেন্ডেন্সিটি শুধুমাত্র ডেভেলপমেন্ট ও টেস্টের সময়েই ব্যবহৃত হবে।

একবার ডিপেন্ডেন্সি বলে দেয়া হলে শেষ আরেকটি ধাপ রয়েছে, তাদেরকে ফেচ করা। এটি bundle install এর মত।

mix deps.get

শেষ! আমরা আমাদের প্রজেক্টের ডিপেন্ডেন্সি বর্ণনা ও ফেচ করা দেখলাম। এখন আমরা দরকারমত ডিপেন্ডেন্সি যোগ করতে পারব।

এনভায়রনমেন্ট

বান্ডলারের মতই মিক্স অনেকগুলি এনভায়রনমেন্ট সাপোর্ট করে থাকে। সরাসরি তিনটি এনভায়রনমেন্ট মিক্স আমাদের দিয়ে থাকে-

কারেন্ট এনভায়রনমেন্টকে পেতে হলে Mix.env ব্যবহার করব। এনভায়রনমেন্ট পরিবর্তন করতে হলে MIX_ENV এনভায়রনমেন্ট ভেরিয়েবল দিয়ে করতে পারি।

MIX_ENV=prod mix compile
Caught a mistake or want to contribute to the lesson? Edit this lesson on GitHub!