মিক্স
এলিক্সির নিয়ে আরও গভীরে যাওয়ার আগে আমাদের “মিক্স” সম্পর্কে জানা উচিত। যদি আপনি রুবীর সাথে পরিচিত হয়ে থাকেন তাহলে মিক্সকে ধরে নিতে পারেন বান্ডলার, রুবী-জেম ও রেইকের সমন্বয় হিসেবে। যে কোন এলিক্সির প্রজেক্টের জন্য এটি অত্যন্ত গুরুত্বপূর্ণ এবং এই অধ্যায়ে আমরা মিক্সের বিশাল ফাংশনালিটির মধ্যে কতিপয় কিছু নিয়ে আলোচনা করব। মিক্স সংক্রান্ত অন্যান্য বিষয় জানতে রান করুন 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
শেষ! আমরা আমাদের প্রজেক্টের ডিপেন্ডেন্সি বর্ণনা ও ফেচ করা দেখলাম। এখন আমরা দরকারমত ডিপেন্ডেন্সি যোগ করতে পারব।
এনভায়রনমেন্ট
বান্ডলারের মতই মিক্স অনেকগুলি এনভায়রনমেন্ট সাপোর্ট করে থাকে। সরাসরি তিনটি এনভায়রনমেন্ট মিক্স আমাদের দিয়ে থাকে-
-
:dev
— ডিফল্ট এনভায়রনমেন্ট -
:test
—mix test
এর জন্য। পরবর্তী অধ্যায়ে দেখান হবে। -
:prod
— প্রডাকশনের জন্য।
কারেন্ট এনভায়রনমেন্টকে পেতে হলে Mix.env
ব্যবহার করব। এনভায়রনমেন্ট পরিবর্তন করতে হলে MIX_ENV
এনভায়রনমেন্ট ভেরিয়েবল দিয়ে করতে পারি।
MIX_ENV=prod mix compile
Caught a mistake or want to contribute to the lesson? Edit this lesson on GitHub!