Composer Scripts: การรันคำสั่งอัตโนมัติ
ในบทเรียนก่อนหน้านี้ เราได้เรียนรู้เกี่ยวกับการจัดการ Dependencies, Autoloading, Error Handling, Logging และ Environment Variables โดยใช้ Composer และเครื่องมือต่างๆ ในระบบ PHP Ecosystem ในบทนี้ เราจะมาเรียนรู้เกี่ยวกับ Composer Scripts ซึ่งเป็นฟีเจอร์ที่ช่วยให้เราสามารถรันคำสั่งต่างๆ โดยอัตโนมัติเมื่อเกิดเหตุการณ์บางอย่างใน Composer เช่น หลังจากการติดตั้ง Dependencies หรือหลังจากการอัพเดท Dependencies เป็นต้น
Composer Scripts คืออะไร?
Composer Scripts คือชุดคำสั่งที่เรากำหนดไว้ในไฟล์ composer.json ซึ่งจะถูกรันโดย Composer เมื่อเกิดเหตุการณ์ต่างๆ ที่เกี่ยวข้องกับการจัดการ Dependencies เช่น การติดตั้ง, การอัพเดท, การลบ หรือเหตุการณ์อื่นๆ ที่เรากำหนดเอง
Composer Scripts ช่วยให้เราสามารถ automate งานต่างๆ ที่เกี่ยวข้องกับการจัดการโปรเจกต์ของเราได้ เช่น การเคลียร์ Cache, การสร้าง Database Schema, การรัน Unit Tests หรือการ Deploy โปรเจกต์ไปยัง Server เป็นต้น
การใช้งาน Scripts ใน composer.json
การกำหนด Scripts ใน composer.json ทำได้โดยการเพิ่ม Section ที่ชื่อว่า "scripts" เข้าไปในไฟล์ composer.json ภายใน Section นี้ เราจะกำหนด Key เป็นชื่อของ Script และ Value เป็นคำสั่งที่เราต้องการให้รัน
{
"name": "your-vendor/your-package",
"description": "Your project description",
"require": {
"php": "^7.4 || ^8.0"
},
"autoload": {
"psr-4": {
"YourVendor\\YourPackage\\": "src/"
}
},
"scripts": {
"post-install-cmd": [
"YourVendor\\YourPackage\\ScriptHandler::postInstall"
],
"post-update-cmd": [
"YourVendor\\YourPackage\\ScriptHandler::postUpdate"
],
"clear-cache": [
"rm -rf var/cache/*"
],
"test": [
"phpunit"
]
}
}
ในตัวอย่างข้างต้น เราได้กำหนด Scripts ไว้ 4 ตัว:
post-install-cmd: คำสั่งที่จะถูกรันหลังจากการติดตั้ง Dependenciespost-update-cmd: คำสั่งที่จะถูกรันหลังจากการอัพเดท Dependenciesclear-cache: คำสั่งที่เรากำหนดเองเพื่อเคลียร์ Cachetest: คำสั่งที่เรากำหนดเองเพื่อรัน Unit Tests
post-install-cmd และ post-update-cmd
post-install-cmd และ post-update-cmd เป็น Scripts พิเศษที่ Composer จะรันโดยอัตโนมัติหลังจากการติดตั้งหรืออัพเดท Dependencies ตามลำดับ โดยปกติแล้ว Scripts เหล่านี้จะถูกใช้เพื่อทำ tasks ที่จำเป็นหลังจากการติดตั้ง Dependencies เช่น การสร้างไฟล์ Config, การ Migrate Database หรือการ Compile Assets
ในตัวอย่างข้างต้น เราได้กำหนดให้ post-install-cmd และ post-update-cmd รัน Static Method ที่ชื่อว่า postInstall และ postUpdate ใน Class YourVendor\YourPackage\ScriptHandler ซึ่งหมายความว่าเราต้องสร้าง Class ScriptHandler และ Method เหล่านั้นขึ้นมาเอง
<?php
namespace YourVendor\YourPackage;
class ScriptHandler
{
public static function postInstall()
{
echo "Running post-install command\n";
// Add your post-install logic here
}
public static function postUpdate()
{
echo "Running post-update command\n";
// Add your post-update logic here
}
}
หลังจากสร้าง Class และ Method เหล่านั้นแล้ว เราต้องตรวจสอบให้แน่ใจว่า Class ScriptHandler ถูก Autoload โดย Composer โดยการกำหนด Autoloading Rules ใน Section "autoload" ใน composer.json (ตามที่แสดงในตัวอย่างก่อนหน้านี้)
ข้อผิดพลาดที่พบบ่อย: ลืมกำหนด Autoloading Rules สำหรับ Class ที่ใช้ใน Scripts ทำให้ Composer ไม่สามารถหา Class นั้นได้และเกิด Error ขึ้น
Custom Scripts
นอกจาก post-install-cmd และ post-update-cmd แล้ว เรายังสามารถกำหนด Scripts อื่นๆ ได้ตามต้องการ โดยการตั้งชื่อ Script เอง เช่น clear-cache หรือ test ในตัวอย่างข้างต้น
การรัน Custom Scripts ทำได้โดยใช้คำสั่ง composer run-script [script-name] ใน Terminal ตัวอย่างเช่น:
composer run-script clear-cache
คำสั่งนี้จะรัน Script ที่ชื่อว่า clear-cache ซึ่งในตัวอย่างของเราคือ rm -rf var/cache/* ซึ่งจะลบไฟล์ทั้งหมดใน Directory var/cache
ข้อควรระวัง: การใช้คำสั่ง Shell โดยตรงใน Scripts อาจทำให้เกิดปัญหาด้าน Security ได้ หากมี User Input เข้ามาเกี่ยวข้อง ควรระมัดระวังและตรวจสอบ Input ให้ดีก่อนที่จะนำไปใช้ในคำสั่ง Shell
เรายังสามารถกำหนดให้ Custom Scripts รันคำสั่ง PHP ได้เช่นกัน โดยการใช้ php -r ตามด้วย Code PHP ที่เราต้องการให้รัน ตัวอย่างเช่น:
{
"scripts": {
"generate-key": [
"php -r \"echo bin2hex(random_bytes(32));\""
]
}
}
Script นี้จะ Generate Random Key ขนาด 32 Bytes และแสดงผลออกมา
กรณีใช้งานจริง
ต่อไปนี้เป็นตัวอย่างกรณีใช้งานจริงของ Composer Scripts:
- การเคลียร์ Cache: หลังจาก Deploy โปรเจกต์ไปยัง Server เราอาจต้องการเคลียร์ Cache เพื่อให้โปรเจกต์แสดงผลข้อมูลล่าสุด เราสามารถกำหนด Script เพื่อเคลียร์ Cache ได้โดยอัตโนมัติ
- การ Migrate Database: หลังจาก Update Code ที่มีการเปลี่ยนแปลง Database Schema เราอาจต้องการ Migrate Database เพื่อให้ Schema ตรงกับ Code เราสามารถกำหนด Script เพื่อ Migrate Database ได้โดยอัตโนมัติ
- การรัน Unit Tests: ก่อนที่จะ Commit Code เราอาจต้องการรัน Unit Tests เพื่อตรวจสอบว่า Code ของเราทำงานได้อย่างถูกต้อง เราสามารถกำหนด Script เพื่อรัน Unit Tests ได้โดยอัตโนมัติ
- การสร้าง Documentation: เราสามารถใช้ Composer Scripts เพื่อ Generate Documentation โดยอัตโนมัติเมื่อมีการเปลี่ยนแปลง Code
สรุป
Composer Scripts เป็นเครื่องมือที่มีประโยชน์อย่างมากในการ automate tasks ต่างๆ ที่เกี่ยวข้องกับการจัดการโปรเจกต์ PHP ของเรา ช่วยให้เราประหยัดเวลาและลดข้อผิดพลาดที่อาจเกิดขึ้นจากการทำ tasks เหล่านั้นด้วยตนเอง การทำความเข้าใจและใช้งาน Composer Scripts อย่างถูกต้องจะช่วยเพิ่มประสิทธิภาพในการพัฒนาโปรเจกต์ PHP ของเราได้อย่างมาก
ในบทเรียนถัดไป เราจะมาเรียนรู้เกี่ยวกับ Debugging Tools ที่มีให้ใช้งานกับ PHP และวิธีการใช้งาน Tools เหล่านั้นเพื่อ Debug Code ของเรา