Apache Ant একটি বিল্ড টুল যা সফটওয়্যার ডেভেলপমেন্টে অটোমেটেড বিল্ড, টেস্টিং, এবং ডিপ্লয়মেন্ট প্রক্রিয়া সহজ করে তোলে। এর মধ্যে Execution Flow Control Tasks ব্যবহৃত হয় টাস্কের বা টার্গেটের এক্সিকিউশন নিয়ন্ত্রণ করার জন্য। এই টাস্কগুলো আপনাকে টাস্ক বা টার্গেটগুলির চলমান অর্ডার, শর্তাধীন এক্সিকিউশন এবং পুনরাবৃত্তি পরিচালনা করতে সহায়তা করে।
এই নিবন্ধে আমরা Execution Flow Control Tasks এর মধ্যে কিছু সাধারণ টাস্ক এবং তাদের ব্যবহারের উদাহরণ নিয়ে আলোচনা করবো, যা আপনার বিল্ড স্ক্রিপ্টে কার্যক্রমের প্রবাহ নিয়ন্ত্রণ করতে সাহায্য করবে।
depend
টাস্কটি একটি টার্গেটের মধ্যে অন্য টার্গেটের উপর নির্ভরশীলতা সংজ্ঞায়িত করতে ব্যবহৃত হয়। এটি নিশ্চিত করে যে নির্দিষ্ট টার্গেটটি এক্সিকিউট করার আগে নির্ভরশীল টার্গেটটি প্রথমে সম্পাদিত হবে।
<target name="compile">
<echo message="Compiling source code..."/>
</target>
<target name="build" depends="compile">
<echo message="Building the project..."/>
</target>
এটি build
টার্গেটকে compile
টার্গেটের উপর নির্ভরশীল করে তোলে, অর্থাৎ compile
টার্গেটটি প্রথমে এক্সিকিউট হবে, তারপর build
টার্গেট এক্সিকিউট হবে।
depends
: এটি নির্দিষ্ট টার্গেট বা টাস্কের উপর নির্ভরশীলতা তৈরি করে।if
টাস্কটি শর্ত পূর্ণ হলে নির্দিষ্ট টার্গেট এক্সিকিউট করতে ব্যবহৃত হয়। এটি সাধারণত যখন কোনও শর্ত পূর্ণ হলে একটি টার্গেট চালাতে হয় তখন ব্যবহৃত হয়।
<property name="compile" value="true"/>
<target name="compile" if="compile">
<echo message="Compiling the source code..."/>
</target>
এটি compile
প্রপার্টি যদি true
থাকে, তাহলে compile
টার্গেটটি এক্সিকিউট হবে।
if
: শর্ত পূর্ণ হলে টার্গেট এক্সিকিউট হবে।unless
টাস্কটি একটি শর্তের বিপরীতে কাজ করে। এটি তখন এক্সিকিউট হয় যখন নির্দিষ্ট শর্ত পূর্ণ না হয়।
<property name="skip.compile" value="true"/>
<target name="compile" unless="skip.compile">
<echo message="Compilation is skipped"/>
</target>
এটি skip.compile
প্রপার্টি যদি true
থাকে, তবে compile
টার্গেটটি এক্সিকিউট হবে না।
unless
: শর্ত পূর্ণ না হলে টার্গেট এক্সিকিউট হবে।sequential
টাস্কটি একাধিক টাস্ককে একসাথে সিকোয়েন্সে চালাতে ব্যবহৃত হয়। এটি একের পর এক টাস্ক বা টার্গেট এক্সিকিউট করার জন্য উপকারী।
<target name="process">
<sequential>
<echo message="Task 1"/>
<echo message="Task 2"/>
<echo message="Task 3"/>
</sequential>
</target>
এটি Task 1
, Task 2
, এবং Task 3
বার্তাগুলি একের পর এক কনসোলে প্রিন্ট করবে।
sequential
: একাধিক টাস্ক বা টার্গেট একে একে এক্সিকিউট করবে।parallel
টাস্কটি একাধিক টাস্ক বা টার্গেটকে একসাথে বা প্যারালেল (একসাথে) এক্সিকিউট করতে ব্যবহৃত হয়। এটি বিশেষত দ্রুত বিল্ড করার জন্য উপকারী, যখন একাধিক কাজকে একসাথে চালানো সম্ভব।
<target name="parallel-tasks">
<parallel>
<target name="task1">
<echo message="Running Task 1"/>
</target>
<target name="task2">
<echo message="Running Task 2"/>
</target>
</parallel>
</target>
এটি task1
এবং task2
একযোগে চালাবে এবং তাদের বার্তা প্রিন্ট করবে।
parallel
: একাধিক টাস্ক একযোগে বা প্যারালেল এক্সিকিউট করবে।macrodef
টাস্কটি একটি কাস্টম মেক্রো তৈরি করতে ব্যবহৃত হয়, যা পুনরায় ব্যবহারযোগ্য টাস্ক বা কাজ। এটি অন্যান্য টাস্ক বা টার্গেটের মধ্যে ব্যবহার করতে পারে।
<macrodef name="greet">
<attribute name="name"/>
<sequential>
<echo message="Hello, ${name}!" />
</sequential>
</macrodef>
<target name="say-hello">
<greet name="Apache Ant"/>
</target>
এটি greet
নামে একটি কাস্টম মেক্রো তৈরি করবে, যা "Hello, Apache Ant!" বার্তা প্রিন্ট করবে।
macrodef
: কাস্টম মেক্রো তৈরি করতে ব্যবহৃত হয়।attribute
: মেক্রোর জন্য প্যারামিটার নির্ধারণ করে।waitfor
টাস্কটি একটি শর্ত পূর্ণ না হওয়া পর্যন্ত বিল্ড প্রক্রিয়া থামিয়ে রাখে। এটি সাধারণত তখন ব্যবহৃত হয় যখন আপনি নিশ্চিত হতে চান যে কোনও নির্দিষ্ট শর্ত পূর্ণ না হলে পরবর্তী টাস্ক এক্সিকিউট হবে না।
<waitfor>
<condition>
<isset property="build.success"/>
</condition>
<echo message="Build successful!"/>
</waitfor>
এটি build.success
প্রপার্টি সেট না হওয়া পর্যন্ত বিল্ড থামিয়ে রাখবে এবং যখন এটি সেট হবে তখন "Build successful!" বার্তা প্রিন্ট করবে।
waitfor
: শর্ত পূর্ণ না হওয়া পর্যন্ত বিল্ড থামিয়ে রাখে।condition
: শর্ত যাচাই করে।Apache Ant Execution Flow Control Tasks আপনাকে বিল্ড প্রক্রিয়ায় কার্যকলাপের প্রবাহ নিয়ন্ত্রণ করতে সহায়তা করে। depend
, if
, unless
, sequential
, parallel
, macrodef
, এবং waitfor
টাস্কগুলি আপনাকে নির্দিষ্ট শর্ত অনুযায়ী টাস্কের এক্সিকিউশন অর্ডার বা প্রবাহ পরিচালনা করতে সক্ষম করে। এই টাস্কগুলির মাধ্যমে, আপনি বিল্ড স্ক্রিপ্টকে আরও কাস্টমাইজড, নমনীয় এবং কার্যকরী করতে পারেন, যা বিল্ড প্রক্রিয়াকে আরো দক্ষ ও ত্রুটিমুক্ত করে তোলে।
Apache Ant-এ depends
অ্যাট্রিবিউটটি একটি টাস্কের মধ্যে নির্দিষ্ট করে দেয় যে ওই টাস্কটি অন্য কোন টাস্কের ওপর নির্ভরশীল। অর্থাৎ, আপনি যখন কোন টাস্ক রান করতে চান, তখন আপনাকে সেই টাস্কটি রান করার আগে অন্য একটি টাস্ক বা টাস্কগুলির কার্য সম্পাদন করতে হবে।
depends
অ্যাট্রিবিউটটি target টাস্কে ব্যবহৃত হয় এবং এটি একটি বা একাধিক টার্গেটের নাম গ্রহণ করে। এই টার্গেটগুলি ডিপেন্ডেন্ট টাস্ক হিসেবে রান হবে, এরপর বর্তমান টাস্কটি রান হবে।
<target name="target_name" depends="dependency_target1, dependency_target2">
<!-- task definitions -->
</target>
এটি একটি মৌলিক উদাহরণ যেখানে একটি টার্গেটের ডিপেন্ডেন্সি ব্যবহৃত হচ্ছে:
<project name="DependsExample" default="build" basedir=".">
<!-- Clean target: removes old build files -->
<target name="clean">
<echo message="Cleaning build directory..." />
<delete dir="build" />
</target>
<!-- Compile target: compiles the Java code -->
<target name="compile" depends="clean">
<echo message="Compiling Java code..." />
<javac srcdir="src" destdir="build/classes" />
</target>
<!-- Build target: creates a JAR file -->
<target name="build" depends="compile">
<echo message="Building JAR file..." />
<jar destfile="build/myapp.jar" basedir="build/classes" />
</target>
</project>
এখানে:
build
ডিরেক্টরি মুছে দেয়।Cleaning build directory...
Compiling Java code...
Building JAR file...
এটি Ant স্ক্রিপ্টে টাস্কের সিকোয়েন্স এবং ডিপেন্ডেন্সি সেট করার একটি খুব সাধারণ উদাহরণ।
আপনি একাধিক টাস্কের উপর ডিপেন্ডেন্সি নির্ধারণ করতে পারেন, যেখানে একটি টার্গেট একাধিক টাস্কের পরে রান হবে।
<project name="MultipleDependsExample" default="deploy" basedir=".">
<!-- Target to clean old files -->
<target name="clean">
<echo message="Cleaning up old files..." />
</target>
<!-- Target to compile Java files -->
<target name="compile">
<echo message="Compiling the Java code..." />
</target>
<!-- Target to package the application -->
<target name="package">
<echo message="Packaging the application..." />
</target>
<!-- Target to deploy the application, depends on clean, compile, and package -->
<target name="deploy" depends="clean, compile, package">
<echo message="Deploying the application..." />
</target>
</project>
এখানে:
Cleaning up old files...
Compiling the Java code...
Packaging the application...
Deploying the application...
এটি অনেক টাস্কের জন্য একসাথে ডিপেন্ডেন্সি ব্যবহার করার একটি উদাহরণ।
একটি circular dependency তখন ঘটে যখন টাস্কগুলি একে অপরের উপর নির্ভরশীল হয়ে একটি অবিন্যস্ত লুপ তৈরি করে। যেমন:
<project name="CircularDependencyExample" default="taskA" basedir=".">
<target name="taskA" depends="taskB">
<echo message="Executing taskA..." />
</target>
<target name="taskB" depends="taskA">
<echo message="Executing taskB..." />
</target>
</project>
এখানে:
এটা এড়িয়ে চলা উচিত, কারণ এটি স্ক্রিপ্টের কার্যকারিতা নষ্ট করতে পারে। আপনাকে এধরনের লুপ এড়াতে হবে বা সঠিকভাবে ডিপেন্ডেন্সি তৈরি করতে হবে।
Ant টাস্কগুলি সাধারণত একটি নির্দিষ্ট বিল্ড লাইফসাইকেলে থাকে, যেমন clean, compile, test, deploy। এই টাস্কগুলির মধ্যে ডিপেন্ডেন্সি নির্ধারণ করা যায় যাতে কার্যক্রম একটি সঠিক সিকোয়েন্সে সম্পন্ন হয়।
<project name="BuildLifecycle" default="deploy" basedir=".">
<target name="clean">
<echo message="Cleaning build artifacts..." />
</target>
<target name="compile" depends="clean">
<echo message="Compiling source code..." />
</target>
<target name="test" depends="compile">
<echo message="Running tests..." />
</target>
<target name="deploy" depends="test">
<echo message="Deploying application..." />
</target>
</project>
এখানে:
Cleaning build artifacts...
Compiling source code...
Running tests...
Deploying application...
এটি বিল্ড লাইফসাইকেলে টাস্কগুলির নির্দিষ্ট অর্ডারে ডিপেন্ডেন্সি তৈরি করার একটি উদাহরণ।
আপনি depends
অ্যাট্রিবিউটকে condition টাস্কের সাথে একত্রে ব্যবহার করে শর্তসাপেক্ষভাবে টাস্কগুলির উপর নির্ভরশীলতা তৈরি করতে পারেন। উদাহরণস্বরূপ, একটি টাস্ক শুধুমাত্র তখনই রান হবে যখন একটি নির্দিষ্ট প্রপার্টি নির্দিষ্ট মান ধারণ করবে।
<project name="ConditionalDependsExample" default="deploy" basedir=".">
<property name="isReady" value="true" />
<target name="prepare" depends="checkCondition">
<echo message="Preparing..." />
</target>
<target name="checkCondition">
<condition property="isReady" value="true">
<equals arg1="${isReady}" arg2="true" />
</condition>
</target>
<target name="deploy" depends="prepare">
<echo message="Deploying..." />
</target>
</project>
এখানে:
isReady
প্রপার্টি যদি true
হয়, তবে prepare টাস্কটি চলবে এবং পরে deploy টাস্কটি চালানো হবে।Preparing...
Deploying...
এটি depends অ্যাট্রিবিউট এবং condition টাস্ক ব্যবহার করে শর্তসাপেক্ষ ডিপেন্ডেন্সি তৈরি করার একটি উদাহরণ।
depends
অ্যাট্রিবিউটটি Apache Ant-এ টাস্কের মধ্যে ডিপেন্ডেন্সি কনফিগার করার জন্য ব্যবহৃত হয়, যা একটি টাস্কের পরবর্তী কার্যক্রম নির্ধারণ করে। এটি আপনাকে একাধিক টাস্কের মধ্যে সঠিক অর্ডারে কাজ সম্পাদন করতে সহায়তা করে। depends
অ্যাট্রিবিউট ব্যবহার করে আপনি টাস্কগুলির মধ্যে সঠিক সম্পর্ক এবং কার্যক্রমের সিকোয়েন্স তৈরি করতে পারেন, যা বিল্ড প্রক্রিয়াকে আরও কার্যকরী ও অটোমেটেড করে তোলে।
Apache Ant একটি শক্তিশালী বিল্ড টুল যা XML-based build scripts ব্যবহার করে বিভিন্ন কাজ পরিচালনা করতে সাহায্য করে। <antcall>
টাস্কটি অ্যাপাচি অ্যান্টে ব্যবহৃত হয় একটি টার্গেটকে অন্য টার্গেটের মধ্যে কল (invoke) করার জন্য। এটি আপনাকে একই বিল্ড স্ক্রিপ্টের মধ্যে এক টার্গেট থেকে অন্য টার্গেটকে কল করে কাজের ধারাবাহিকতা বা পুনঃব্যবহারযোগ্যতা নিশ্চিত করতে সাহায্য করে।
<antcall>
টাস্কটির মাধ্যমে আপনি একটি নির্দিষ্ট টার্গেটকে কেবল এক্সিকিউট করতে পারবেন এবং তা পরে একই স্ক্রিপ্টে ফিরে আসবে এবং কাজ সম্পন্ন করবে।
<antcall>
Task: Overview<antcall>
টাস্কটি বিল্ড স্ক্রিপ্টের মধ্যে একটি টার্গেটকে অন্য টার্গেটের মধ্যে কল (invoke) করতে ব্যবহৃত হয়। এটি মূলত একটি recursive মেকানিজম হিসেবে কাজ করে, যেখানে আপনি এক টার্গেটের মধ্যে অন্য টার্গেটকে কল করতে পারেন।
<antcall target="target_name"/>
target
: এটি সেই টার্গেটের নাম, যেটি আপনি কল করতে চান।<antcall>
Task: উদাহরণantcall
উদাহরণ:এখানে একটি সাধারণ উদাহরণ দেওয়া হলো যেখানে একটি টার্গেট build
এবং অন্য একটি টার্গেট clean
কল করা হচ্ছে।
<project name="AntcallExample" default="main-target">
<!-- Clean Target -->
<target name="clean">
<echo message="Cleaning the project..."/>
<delete dir="build"/>
</target>
<!-- Build Target -->
<target name="build">
<echo message="Building the project..."/>
</target>
<!-- Main Target that calls other targets -->
<target name="main-target">
<echo message="Starting the build process..."/>
<antcall target="clean"/>
<antcall target="build"/>
<echo message="Build process completed."/>
</target>
</project>
এখানে:
main-target
টাস্কটি প্রথমে clean
টার্গেটকে কল করছে এবং তারপর build
টার্গেটটিকে কল করছে।<antcall>
টাস্কের মাধ্যমে আপনি এক টার্গেটের মধ্যে অন্য টার্গেটগুলো কল করতে পারেন।antcall
উদাহরণ:আপনি <antcall>
টাস্কে প্যারামিটারও পাস করতে পারেন। এর মাধ্যমে আপনি একটি টার্গেটের জন্য চলতি প্রপার্টি বা প্যারামিটার পাঠাতে পারবেন।
<project name="AntcallWithParamsExample" default="main-target">
<!-- Clean Target -->
<target name="clean">
<echo message="Cleaning the project..."/>
<delete dir="build"/>
</target>
<!-- Build Target with Parameters -->
<target name="build">
<echo message="Building the project with version: ${project.version}"/>
</target>
<!-- Main Target that calls other targets and passes parameters -->
<target name="main-target">
<property name="project.version" value="1.0.0"/>
<echo message="Starting the build process..."/>
<antcall target="clean"/>
<antcall target="build"/>
<echo message="Build process completed."/>
</target>
</project>
এখানে:
<property>
টাস্ক ব্যবহার করে একটি প্রপার্টি project.version
সেট করা হয়েছে এবং তা build
টাস্কে পাস করা হয়েছে।build
টাস্কে ${project.version}
প্রপার্টি ব্যবহার করা হয়েছে এবং সেই মান আউটপুট করা হচ্ছে।antcall
Example:আপনি এক টার্গেটের মধ্যে অন্য টার্গেটের recursive call করতে পারেন। এর মাধ্যমে আপনি পুনরায় একটি টাস্ক কল করতে পারেন যা আবার সেই টাস্কের মধ্যে অন্যান্য টাস্ক কল করবে।
<project name="RecursiveAntcallExample" default="start-build">
<!-- A Target that calls itself -->
<target name="recursive-task" if="build.enabled">
<echo message="Running the recursive task..."/>
<antcall target="recursive-task"/>
</target>
<!-- Start Build Process -->
<target name="start-build">
<property name="build.enabled" value="true"/>
<echo message="Starting the recursive build..."/>
<antcall target="recursive-task"/>
</target>
</project>
এখানে:
<antcall>
টাস্ক recursive-task নামক টার্গেটকে পুনরায় কল করছে।if="build.enabled"
শর্তের মাধ্যমে, টাস্কটি কেবল তখনই কল হবে যখন build.enabled
প্রপার্টি true
হবে।<antcall>
Best Practicesif
and unless
Attributes:if
এবং unless
অ্যাট্রিবিউট ব্যবহার করুন। এটি টাস্কের এক্সিকিউশন নিয়ন্ত্রণে সহায়ক হবে।<antcall>
টাস্কে প্যারামিটার পাঠানোর মাধ্যমে টাস্কগুলিকে আরো ডাইনামিক এবং পুনঃব্যবহারযোগ্য করুন।<fail>
টাস্ক ব্যবহার করে ভুল শনাক্ত করুন এবং সেই অনুযায়ী বিল্ড প্রক্রিয়াটি বন্ধ করুন।<antcall>
টাস্ক অ্যাপাচি অ্যান্টের একটি অত্যন্ত শক্তিশালী টাস্ক, যা আপনাকে এক টার্গেট থেকে অন্য টার্গেট কল করতে সহায়তা করে। এটি বিশেষভাবে recursive tasks, parameters passing, এবং sequential task execution এর জন্য উপকারী। Best practices অনুসরণ করে <antcall>
টাস্ক ব্যবহার করলে আপনার বিল্ড স্ক্রিপ্ট আরও কার্যকরী, ডাইনামিক এবং পুনঃব্যবহারযোগ্য হবে।
Apache Ant একটি জনপ্রিয় ওপেন সোর্স বিল্ড টুল যা প্রধানত Java প্রজেক্টের বিল্ড, টেস্টিং এবং ডিপ্লয়মেন্টের জন্য ব্যবহৃত হয়। <subant>
টাস্কটি অ্যাপাচি অ্যান্টে ব্যবহৃত হয় একটি বিল্ড স্ক্রিপ্টের মধ্যে অন্য বিল্ড স্ক্রিপ্ট (sub-build) চালানোর জন্য। এটি একটি বিল্ড ফাইলের মধ্যে অন্য একটি বিল্ড ফাইল (যেমন সাব-বিল্ড) রেফারেন্স করার সুবিধা প্রদান করে, যা অ্যাপাচি অ্যান্টে মডুলার বিল্ড সিস্টেম তৈরি করতে সাহায্য করে।
Subant Task সাধারণত বড় এবং স্কেলেবল প্রজেক্টে ব্যবহৃত হয় যেখানে একটি মূল বিল্ড স্ক্রিপ্ট (parent build) থেকে একাধিক সাব-বিল্ড স্ক্রিপ্ট (sub-builds) চালানো হয়। এটি প্রজেক্টের বিভিন্ন অংশের জন্য আলাদা আলাদা বিল্ড ফাইল তৈরি করার সুবিধা দেয়।
<subant>
টাস্কটি একটি সাব-বিল্ড স্ক্রিপ্ট চালানোর জন্য ব্যবহৃত হয়। এই টাস্কটি আপনাকে মূল বিল্ড স্ক্রিপ্ট থেকে অন্য বিল্ড স্ক্রিপ্টের টাস্ক বা টার্গেট চালানোর সুযোগ দেয়।
true
হয়, তাহলে সাব-বিল্ডগুলি সমান্তরালে চালানো হবে (প্যারালাল প্রসেসিং)।true
হয়, তাহলে মূল বিল্ড স্ক্রিপ্টের সমস্ত প্রপার্টি এবং এন্টারপ্রাইজ কনফিগারেশন সাব-বিল্ডে ঐচ্ছিকভাবে হেরিট করবে।<project name="ParentBuild" default="parent-target">
<target name="parent-target">
<echo message="Main build process starts here..."/>
<!-- Running a sub-build -->
<subant file="sub-build.xml" target="sub-target"/>
<echo message="Main build process ends here..."/>
</target>
</project>
<subant>
টাস্কটি sub-build.xml
ফাইল থেকে sub-target
টার্গেট চালাবে।parent-target
প্রথমে চালানো হবে, তারপর sub-target
সাব-বিল্ড ফাইল থেকে চালানো হবে।sub-target
এর মধ্যে থাকা টাস্ক সম্পন্ন হওয়ার পর মূল বিল্ড স্ক্রিপ্টের বাকি অংশ চালানো হবে।<subant>
টাস্কের inheritall
অ্যাট্রিবিউট ব্যবহার করে আপনি মূল বিল্ড ফাইলের সমস্ত প্রপার্টি এবং অন্যান্য কনফিগারেশন সাব-বিল্ডে হেরিট করতে পারেন।
inheritall
<project name="ParentBuild" default="parent-target">
<!-- Property Definition in Parent Build -->
<property name="project.name" value="MyJavaApp"/>
<target name="parent-target">
<echo message="Running parent build..."/>
<!-- Running a sub-build with inherited properties -->
<subant file="sub-build.xml" target="sub-target" inheritall="true"/>
<echo message="Main build complete"/>
</target>
</project>
sub-build.xml
:
<project name="SubBuild" default="sub-target">
<target name="sub-target">
<!-- Using inherited property from parent build -->
<echo message="Sub-build for ${project.name}"/>
</target>
</project>
parent-build.xml
এ project.name
নামক একটি প্রপার্টি ডিফাইন করা হয়েছে।<subant inheritall="true"/>
ব্যবহারের মাধ্যমে সাব-বিল্ড ফাইল sub-build.xml
এই প্রপার্টি ও অন্যান্য কনফিগারেশনকে হেরিট করবে এবং ${project.name}
প্রপার্টি ব্যবহার করে সাব-বিল্ডের মধ্যে একটি মেসেজ প্রদর্শিত হবে।<subant>
টাস্কের মাধ্যমে আপনি একাধিক সাব-বিল্ড চালাতে পারেন, এবং যদি parallel="true"
অ্যাট্রিবিউট ব্যবহার করেন, তাহলে একাধিক সাব-বিল্ড সমান্তরালে (প্যারালাল) চালানো হবে।
<project name="ParentBuild" default="parent-target">
<target name="parent-target">
<echo message="Running parent build..."/>
<!-- Running multiple sub-builds in parallel -->
<subant file="sub-build1.xml" target="sub-target" parallel="true"/>
<subant file="sub-build2.xml" target="sub-target" parallel="true"/>
<echo message="All sub-builds completed"/>
</target>
</project>
sub-build1.xml
এবং sub-build2.xml
সমান্তরালে (parallel) চালানো হবে।parallel="true"
অ্যাট্রিবিউট ব্যবহার করা হয়েছে, যার ফলে দুটি সাব-বিল্ড একসাথে চালানো হবে।সাব-বিল্ডগুলির মধ্যে নির্ভরতা তৈরি করতে পারেন, অর্থাৎ একটি সাব-বিল্ডের সম্পন্ন হওয়ার পর অন্য একটি চালানোর জন্য নির্ধারণ করা যেতে পারে।
<project name="ParentBuild" default="parent-target">
<target name="parent-target">
<echo message="Running parent build..."/>
<!-- Running sub-build 1 first -->
<subant file="sub-build1.xml" target="sub-target"/>
<!-- Running sub-build 2 after sub-build 1 completes -->
<subant file="sub-build2.xml" target="sub-target"/>
<echo message="Sub-builds completed in sequence"/>
</target>
</project>
sub-build1.xml
টাস্কটি প্রথমে চালানো হবে, এবং এর পরেই sub-build2.xml
টাস্কটি চালানো হবে।<subant>
Task<subant>
টাস্কটি অ্যাপাচি অ্যান্টে একটি অত্যন্ত কার্যকর টাস্ক যা আপনাকে মূল বিল্ড স্ক্রিপ্ট থেকে একাধিক সাব-বিল্ড ফাইল চালাতে সাহায্য করে। এটি আপনাকে বিল্ড স্ক্রিপ্টের মধ্যে মডুলার কাজ করতে এবং একাধিক সাব-বিল্ড ফাইল পুনরায় ব্যবহার করতে সক্ষম করে। parallel="true"
অ্যাট্রিবিউট ব্যবহার করে আপনি একাধিক সাব-বিল্ড সমান্তরালে চালাতে পারেন এবং inheritall
অ্যাট্রিবিউটের মাধ্যমে মূল বিল্ড স্ক্রিপ্টের প্রপার্টি ও কনফিগারেশন সাব-বিল্ডে হেরিট করতে পারেন।
অ্যাপাচি অ্যান্ট (Apache Ant) একটি ওপেন সোর্স বিল্ড টুল যা সফটওয়্যার ডেভেলপমেন্ট ও বিল্ড প্রক্রিয়া অটোমেট করতে ব্যবহৃত হয়। এটি বিল্ড ফাইল (build.xml
) ভিত্তিক এবং সেই ফাইলগুলির মধ্যে ডিফাইন করা টাস্কের মাধ্যমে বিভিন্ন কার্যক্রম পরিচালনা করে।
এছাড়া, অ্যাপাচি অ্যান্টে Ant Task নামে একটি টাস্ক আছে যা আপনাকে অন্য কোনো বিল্ড ফাইলের টাস্ক চালানোর সুযোগ দেয়। এটি তখন ব্যবহৃত হয় যখন আপনি একটি বিল্ড স্ক্রিপ্টের মধ্যে অন্য একটি বিল্ড স্ক্রিপ্টের টাস্ক ব্যবহার করতে চান।
Ant Task টাস্কটি অন্য বিল্ড ফাইলের টাস্ক বা টার্গেট চালাতে ব্যবহৃত হয়। এটি মূলত একটি বিল্ড স্ক্রিপ্ট থেকে অন্য স্ক্রিপ্টের টাস্ক বা টার্গেট এক্সিকিউট করার জন্য ব্যবহৃত হয়। এতে আপনি অন্য কোনো বিল্ড ফাইলের নির্দিষ্ট টাস্ক বা টার্গেট চালানোর জন্য সেই ফাইলটি রেফারেন্স করতে পারবেন।
টাস্কটি অন্য বিল্ড ফাইল থেকে টাস্ক বা টার্গেট চালাতে ব্যবহৃত হয়। এর মাধ্যমে আপনি একটি বিল্ড ফাইলের মধ্যে অন্য বিল্ড ফাইলের নির্দিষ্ট টাস্ক বা টার্গেট ইন্টারনালি চালাতে পারেন।
<ant file="build.xml" target="target_name"/>
এটি build.xml
ফাইল থেকে target_name
নামক টার্গেট চালাবে।
file অ্যাট্রিবিউটটি সেই বিল্ড ফাইলের পাথ নির্ধারণ করে, যেটি আপনি চালাতে চান। এটি আপনার কাজের স্ক্রিপ্টের বাইরের একটি বিল্ড ফাইল হতে পারে।
উদাহরণ:
<ant file="other_build.xml" target="compile"/>
এটি other_build.xml
বিল্ড ফাইল থেকে compile
টার্গেট চালাবে।
target অ্যাট্রিবিউটটি সেই টার্গেট নির্ধারণ করে, যেটি আপনি অন্য বিল্ড ফাইল থেকে চালাতে চান।
উদাহরণ:
<ant file="other_build.xml" target="clean"/>
এটি other_build.xml
বিল্ড ফাইল থেকে clean
টার্গেট চালাবে।
verbose অ্যাট্রিবিউটটি true
সেট করলে আরো বিস্তারিত আউটপুট প্রদান করবে, যা আপনাকে বুঝতে সাহায্য করবে কীভাবে টাস্কটি সম্পন্ন হচ্ছে।
উদাহরণ:
<ant file="other_build.xml" target="build" verbose="true"/>
এটি other_build.xml
থেকে build
টার্গেট চালাবে এবং সমস্ত কার্যক্রম বিস্তারিতভাবে দেখাবে।
inheritAll অ্যাট্রিবিউটটি যদি true
হয়, তবে এটি প্রথম বিল্ড ফাইলে থাকা সমস্ত প্রপার্টি, টাস্ক এবং কনফিগারেশন দ্বিতীয় বিল্ড ফাইলের মধ্যে হুবহু ব্যবহার করবে।
উদাহরণ:
<ant file="other_build.xml" target="deploy" inheritAll="true"/>
এটি other_build.xml
ফাইলের deploy
টার্গেট চালাবে এবং প্রথম বিল্ড ফাইলের সমস্ত কনফিগারেশন এবং প্রপার্টি ব্যবহার করবে।
inheritRefs অ্যাট্রিবিউটটি যদি true
হয়, তবে এটি দ্বিতীয় বিল্ড ফাইলে প্রথম বিল্ড ফাইলের সমস্ত রেফারেন্স (references) কপি করবে।
উদাহরণ:
<ant file="other_build.xml" target="package" inheritRefs="true"/>
এটি other_build.xml
ফাইলের package
টার্গেট চালাবে এবং প্রথম বিল্ড ফাইলে থাকা সমস্ত রেফারেন্স ব্যবহার করবে।
<project name="MainProject" default="runOtherTarget">
<target name="runOtherTarget">
<!-- Run target from another build file -->
<ant file="other_build.xml" target="compile"/>
</target>
</project>
এখানে, টাস্কটি other_build.xml
ফাইল থেকে compile
টার্গেট চালাবে।
<project name="MainProject" default="runOtherBuild">
<target name="runOtherBuild">
<!-- Run another build file's task with verbose output -->
<ant file="other_build.xml" target="test" verbose="true"/>
</target>
</project>
এটি other_build.xml
ফাইলের test
টার্গেট চালাবে এবং বিল্ড প্রক্রিয়ার বিস্তারিত আউটপুট দেখাবে।
<project name="MainProject" default="runBuild">
<target name="runBuild">
<!-- Run target from another build file, inheriting properties and configurations -->
<ant file="other_build.xml" target="deploy" inheritAll="true"/>
</target>
</project>
এটি other_build.xml
ফাইলের deploy
টার্গেট চালাবে এবং প্রথম বিল্ড ফাইলের সমস্ত প্রপার্টি এবং কনফিগারেশন ব্যবহার করবে।
<project name="MainProject" default="runDeploy">
<target name="runDeploy">
<!-- Run another build file's target with references inherited -->
<ant file="other_build.xml" target="deploy" inheritRefs="true"/>
</target>
</project>
এটি other_build.xml
ফাইলের deploy
টার্গেট চালাবে এবং প্রথম বিল্ড ফাইলের সমস্ত রেফারেন্স ব্যবহার করবে।
টাস্কটি অ্যাপাচি অ্যান্টের একটি গুরুত্বপূর্ণ টাস্ক যা আপনাকে এক বিল্ড ফাইল থেকে অন্য বিল্ড ফাইলের টাস্ক বা টার্গেট চালানোর সুযোগ দেয়। এটি বিশেষত মাল্টি-বিল্ড স্ক্রিপ্ট ব্যবহারের ক্ষেত্রে সহায়ক, যেখানে বিভিন্ন বিল্ড ফাইলে বিভক্ত টাস্কগুলো একত্রে পরিচালিত হয়। file
, target
, verbose
, inheritAll
, এবং inheritRefs
অ্যাট্রিবিউট ব্যবহার করে আপনি আরও কাস্টমাইজড বিল্ড প্রক্রিয়া তৈরি করতে পারেন।
common.read_more