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

কাস্টম মিক্স টাস্ক

এলিক্সির প্রোজেক্টে মিক্স দিয়ে নিজস্ব টাস্ক তৈরি করা।

সূচনা

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

$ mix phx.new my_phoenix_app

* creating my_phoenix_app/config/config.exs
* creating my_phoenix_app/config/dev.exs
* creating my_phoenix_app/config/prod.exs
* creating my_phoenix_app/config/prod.secret.exs
* creating my_phoenix_app/config/test.exs
* creating my_phoenix_app/lib/my_phoenix_app.ex
* creating my_phoenix_app/lib/my_phoenix_app/endpoint.ex
* creating my_phoenix_app/test/views/error_view_test.exs
...

উপরের শেল কমান্ড থেকে আমরা দেখতে পাচ্ছি যে, ফিনিক্স ফ্রেইমওয়ার্ক কাস্টম মিক্স টাস্ক দিয়ে প্রজেক্ট তৈরির কাজটি করে থাকে। আমরা যদি আমাদের প্রোজেক্টের জন্য এমন কিছু করি তাহলে কেমন হয়? এলিক্সির মিক্স ট্যাস্ক দিয়ে এ ধরনের কাজ করতে দেয় খুব সহজেই।

সেটআপ

চলুন, একটি খুব ছোট মিক্স অ্যাপ্লিকেশান তৈরি করি।

$ mix new hello

* creating README.md
* creating .formatter.exs
* creating .gitignore
* creating mix.exs
* creating lib
* creating lib/hello.ex
* creating test
* creating test/test_helper.exs
* creating test/hello_test.exs

Your Mix project was created successfully.
You can use "mix" to compile it, test it, and more:

cd hello
mix test

Run "mix help" for more commands.

এখন, উপরিউক্ত কমান্ড থেকে সদ্য তৈরি করা lib/hello.ex ফাইলের মডিউলে একটি ফাংশন তৈরি করি যা “Hello, World!” আউটপুট দিবে

defmodule Hello do
  @doc """
  Output's `Hello, World!` everytime.
  """
  def say do
    IO.puts("Hello, World!")
  end
end

কাস্টম মিক্স টাস্ক বর্ণনা

এবার আমাদের কাস্টম মিক্স টাস্ক তৈরি করি। একটি নতুন ডিরেক্টরি ও ফাইল তৈরি করি hello/lib/mix/tasks/hello.ex ঐ ফাইলটিতে, নিচের ৭ লাইনের এলিক্সির কোডটি লিখি।

defmodule Mix.Tasks.Hello do
  @moduledoc "The hello mix task: `mix help hello`"
  use Mix.Task

  @shortdoc "Simply calls the Hello.say/0 function."
  def run(_) do
    # calling our Hello.say() function from earlier
    Hello.say()
  end
end

লক্ষ্য করি, আমরা কিন্তু defmodule স্টেটমেন্ট এর শুরুতেই Mix.Tasks এবং যে নামটি কমান্ডলাইনে ব্যবহার করতে চাই তা লিখেছি। ২য় লাইনে, use Mix.Task এর মাধ্যমে Mix.Task বিহেভিয়রকে আমাদের নেইমস্পেইসে আনা হয়। এর পরে, আমরা run ফাংশনটি বানাই যা (আপাতত) কোন আর্গুমেন্ট নেয় না। এই ফাংশনের ভেতরে আমরা Hello মডিউল এবং say ফাংশন ব্যবহার করেছি।

এপ্লিকেশন লোড করা

মিক্স অটোমেটিকালি এপ্লিকেশন স্টার্ট বা এর ডিপেন্ডেন্সীগুলো লোড করে না যা বেশীরভাগ মিক্স টাস্কের ব্যবহার এ প্রভাব ফেলে না। কিন্তু কেমন হবে যদি আমরা এক্টো ব্যবহার করে ডাটাবেস এর সাথে ইন্টারেক্ট করতে চাই? সেক্ষেত্রে, আমাদের খেয়াল রাখতে হবে Ecto.Repo যে এপ এ আছে তা চালু হয়েছে। আমরা দুইভাবে এটা মোকাবেলা করতে পারিঃ নির্দিষ্ট ভাবে কোনো এপ স্টার্ট করে অথবা আমাদের এপ্লিকেশন স্টার্ট করে যেটা বাকি সব এপগুলোকে চালু করবে।

চলুন, আমাদের এপ্লিকেশন এবং এর ডিপেন্ডেন্সীগুলো চালু করার জন্যে, কিভাবে আমরা মিক্স টাস্ককে আপডেট করতে পারি তা দেখিঃ

defmodule Mix.Tasks.Hello do
  @moduledoc "The hello mix task: `mix help hello`"
  use Mix.Task

  @shortdoc "Simply calls the Hello.say/0 function."
  def run(_) do
    # This will start our application
    Mix.Task.run("app.start")

    Hello.say()
  end
end

মিক্স টাস্ক রান করা

এবার আমাদের মিক্স টাস্কটি রান করা যাক। আমরা প্রোজেক্ট ডিরেক্টরি থেকে এই কমান্ডটি রান করতে পারি। কমান্ড লাইন থেকে mix hello রান করলে নিচের মতো আউটপুট দেখতে পাবো-

$ mix hello
Hello, World!

মিক্স কিন্তু বেশ বন্ধুসুলভ! মানুষ মাত্রই ভুল এটা সে জানে, কাজেই যদি কখনো বানান ভুল করেন আপনার কমান্ডটি লিখার সময় তাহলে ফাজি স্ট্রিং ম্যাচিংয়ের মাধ্যমে আপনাকে মিক্স রিকমেন্ড করবে যেমন-

$ mix hell
** (Mix) The task "hell" could not be found. Did you mean "hello"?

আপনি কি খেয়াল করেছেন, আমরা আমাদের টাস্ক মডিউলে @shortdoc নামক একটি নতুন অ্যাট্রিবিউট দেখেছি? যখন আমরা আমাদের এপ্লিকেশন শিপ করবো তখন এটা কাজে লাগবে, যখন ইউজার টার্মিনাল থেকে mix help রান করবে তখন এর উত্তরে দিবে।

$ mix help

mix app.start         # Starts all registered apps
...
mix hello             # Simply calls the Hello.say/0 function.
...

নোটঃ নতুন টাস্ক mix help এর আউটপুটে আসার জন্যে, আমাদের কোডকে অবশ্যই কম্পাইলড হতে হবে। আমরা এটা mix compile কমান্ড রান করে করতে পারি অথবা টাস্ক রান করেও করতে পারি অর্থাৎ mix hello রান করে, যেটা আমাদের জন্যে কম্পাইলেশন ট্রিগার করবে।

Caught a mistake or want to contribute to the lesson? Edit this lesson on GitHub!