ما هو Phing ؟
هو أداة للأتمتة المهام بشكل عام مهما كانت تلك المهام ، بناء تطبيقك ، نشره على الويب ، جمع المعلومات إنشاء التقارير ، غيرها الكثير.
Phing أداة مبنية بلغة البرمجة PHP فكرتها من أداة تنفيذ المهام Ant الشهيرة في عالم Java ، وهي تستخدم ملفات XML لتنفيذ مجموعة من المهام تأخذ شكل التوابع ، وتحتوي على مجموعة ضخمة من المهام المعدة مسبقاً لتسهيل الأمور عليك ، كمهام لتحديث قاعدة البيانات ، النشر عن طريق FTP ,SSH ، ومهام لتعامل مع أنظمة التحكم في النسخ (Version Control Systems) وغيرها الكثير جداً.
تنصيب Phing ؟
هنالك العديد من الطرق التي تستطيع فيها تنصيب Phing يمكن الإطلاع على كافة الطرق من موقعهم الرسمي ، ولكن في هذا الموضوع سوف أقوم باستخدام Composer.
توجه إالى المجلد الجذر في مشروعك وقم بتعديل ملف composer.json
{ "require-dev": { "phing/phing": "2.*" } }
بعد ذلك أطلب من Composer تنصيب الحزمة الجديدة عن طريق تنفيذ الأمر التالي:
composer install
للتأكد من أن كل شئ سار على ما يرام قم بتنقيذ الأمر التالي وتأكد من أنك سوف تحصل على ذات النتيجة :
vendor/phing/phing/bin/phing -h phing [options] [target [target2 [target3] ...]] Options: -h -help print this message -l -list list available targets in this project -v -version print the version information and exit -q -quiet be extra quiet -verbose be extra verbose -debug print debugging information -longtargets show target descriptions during build -logfile <file> use given file for log -logger <classname> the class which is to perform logging -f -buildfile <file> use given buildfile -D<property>=<value> use value for given property -propertyfile <file> load all properties from file -find <file> search for buildfile towards the root of the filesystem and use it -inputhandler <file> the class to use to handle user input Report bugs to <dev@phing.tigris.org>
استخدام Phing
Phing يبحث عن ملف build.xml في المجلد الجذر في مشروعك لبدء تنفيذ المهام الموكلة له مسبقاً دون تدخل مباشر منك ، وعندما تقوم بتجيهز المهام المطلوبة يمكنك تنقيذ الأمر التالي ليبدأ Phing عمله مباشرةً :
vendor/phing/phing/bin/phing
فهم ملف build.xml
هو ملف XML طبيعي يخضع لجميع قواعد XML المعروفة ، يبدأ Phing بمعالجة هذا الملف بالبحث عن العقدة project في هذا الملف وهي تخبر Phing عن معلومات عامة عن هذا المشروع كاسم المشروع و المهمة الأساسية فيه ، وربما تستطيع إدراج ملف متغيرات في هذا الجزء لتحكم بكامل المشروع ، كما في المثال التالي الذي يقوم بإدراج ملف المتغيرات.
version="1.0" encoding="UTF-8"?>name="UsingPhingExample" default="main" basedir="."> file="default.properties" /> message="${author}" />
ملف المتغيرات ملف بسيط يمكن أن يكون شئ مشابه للشكل التالي مع استخدام متغيرات تناسب مشروعك طبعاً
author = Hyyan Abo Fakher db.host = 127.0.0.1 db.user = root db.password = root db.database = foobar facebook.appId = 1234567890-10 facebook.secret = 1234567890qwertyuiopasdfghjkl
عندما يجد Phing العقدة project يقوم بتنفيذ المهمة (Target) الأساسية المحددة في العقدة ، وهو في المثال السابق main.
إن مهام Phing هي شكل من التوابع البسيطة كتوابع PHP يمكن أن تأخذ متغيرات وتحتوي على جمل منطقية ولكن الفرق الوحيد لها عن توابع PHP أنها لا يمكن أن تعيد قيمة.
الأن لنجعل التابع main يقوم بإنشاء مجلد جديد
version="1.0" encoding="UTF-8"?>name="UsingPhingExample" default="main" basedir="."> file="default.properties" /> message="${author}" /> name="main"> msg="Creating new directory..." /> dir="newFolder" />
الأن بإمكانك تشغيل Phing ليقوم بتنفيذ المهمة main ، لتحصل على نتيجة مماثلة لشكل الأتي :
vendor/phing/phing/bin/phing Buildfile: C:\wamp\www\subdomains\gwp\build.xml [property] Loading C:\wamp\www\subdomains\gwp\default.properties [echo] Hyyan Abo Fakher UsingPhingExample > main: [echo] Creating new directory... [mkdir] Created dir: C:\wamp\www\subdomains\gwp\newFolder BUILD FINISHED Total time: 1.4872 second
وضع كل ما سبق معاً
لتكريس الفكرة العامة سوف أقوم بتوسيع المثال السابق ليقوم بالمهام التالية :
- إدراج ملف المتغيرات
- إنشاء المهة الأساسية main التي سوف تقوم بطلب باقي المهمات
- إنشاء مهمة تقوم بإنشاء مجلد جديد
- إنشاء مهمة تقوم بنقل ملفات المجلد الحالي إلى المجلد الجديد المنشئ
- ضغط المجلد الجديد بصيغة zip
في ملف default.properties :
# default.properties file buildDir= .build
في ملف build.xml :
version="1.0" encoding="UTF-8"?>name="UsingPhingExample" default="main" basedir="."> file="default.properties" /> message="Build Dir Was Set To : ${buildDir}" /> name="main" depends="makeDir,copyFiles,compress" /> name="makeDir"> dir="${buildDir}" /> name="copyFiles"> todir="${buildDir}"> dir="."> name="compress"> destfile="project-build.zip" basedir="${buildDir}" />
الأن قم بتشغيل Phing لتحصل على النتيجة التالية :
vendor/phing/phing/bin/phing Buildfile: C:\wamp\www\subdomains\gwp\test.xml [property] Loading C:\wamp\www\subdomains\gwp\default.properties [echo] Build Dir Was Set To : .build UsingPhingExample > makeDir: [mkdir] Created dir: C:\wamp\www\subdomains\gwp\.build UsingPhingExample > copyFiles: [copy] Created 1 empty directory in C:\wamp\www\subdomains\gwp\.build [copy] Copying 7 files to C:\wamp\www\subdomains\gwp\.build UsingPhingExample > compress: [zip] Building zip: C:\wamp\www\subdomains\gwp\project-build.zip UsingPhingExample > main: BUILD FINISHED Total time: 1.9488 second
الملخص
إن Phing هي أداة رائعة تسطيع أتمتة كل شئ مهما كان بالغ الصعوبة ، وسوف توفر عليك كثير من العناء الذي يتنتج عن الخطأ البشري الذي هو حتماً الحلقة الأضعف في أي شئ يحتاج للأتمتة ، ابتداء من أبسط الأشياء كنسخ الملفات وانتهاء بأعقدها كتحديث قاعدة البيانات.