ในฐานะนักพัฒนา PHP ระดับ Senior เราทราบดีว่าการสร้างแอปพลิเคชันที่ทันสมัยไม่ได้หมายถึงการเขียนโค้ดทั้งหมดด้วยตัวเอง แต่คือการใช้ประโยชน์จากระบบนิเวศของไลบรารี (Libraries) หรือแพ็กเกจภายนอกมากมาย สิ่งเหล่านี้ถูกเรียกว่า Dependencies หรือการพึ่งพา
บทนำและแนวคิดสำคัญ: Composer และหัวใจของการควบคุมเวอร์ชัน
Dependency Management คือกระบวนการที่ช่วยให้โปรเจกต์ของเราสามารถระบุ ติดตั้ง และจัดการเวอร์ชันของไลบรารีภายนอกได้อย่างมีระเบียบและแม่นยำ โดยเครื่องมือหลักที่เราใช้คือ Composer ซึ่งเป็น Dependency Manager มาตรฐานสำหรับ PHP
ความแตกต่างที่สำคัญ: composer.json vs. composer.lock
หัวใจของการจัดการ Dependencies ที่ถูกต้อง คือการเข้าใจบทบาทของไฟล์สองประเภทนี้อย่างลึกซึ้ง เพราะทั้งคู่มีหน้าที่ที่แตกต่างกันโดยสิ้นเชิง:
- 📄 composer.json (The Requirements): เป็นไฟล์ที่ระบุ “ข้อกำหนด” ว่าโปรเจกต์ของคุณต้องการไลบรารีอะไรบ้าง และอนุญาตให้ใช้เวอร์ชันใดได้บ้าง เช่น ต้องการ Laravel เวอร์ชัน 9 ขึ้นไป แต่ไม่เกิน 11.0
- ลักษณะข้อมูล: ใช้ช่วงเวอร์ชัน (Version Constraints/Ranges) เช่น
^2.0หรือ>=3.5 <4.0 - การใช้งาน: เป็นไฟล์ที่มนุษย์อ่านได้และใช้ในการพัฒนาครั้งแรกเมื่อมีการอัปเดตความต้องการ
- ลักษณะข้อมูล: ใช้ช่วงเวอร์ชัน (Version Constraints/Ranges) เช่น
- 🔒 composer.lock (The Snapshot): เป็นไฟล์ “ภาพถ่ายสถานะ” ที่บันทึกเวอร์ชันที่แน่นอนของ Dependencies ทุกตัวที่ถูกติดตั้งลงในโปรเจกต์ ณ เวลาใดเวลาหนึ่งเท่านั้น
- ลักษณะข้อมูล: ระบุเวอร์ชันแบบตายตัว (Exact Versions) เช่น
vendor/library-xต้องเป็นเวอร์ชัน 1.2.3 เท่านั้น ห้ามเปลี่ยนเด็ดขาด - ความสำคัญ: รับประกัน “Reproducibility” หรือการสามารถสร้างสภาพแวดล้อมการทำงานที่เหมือนเดิมได้ทุกครั้ง ไม่ว่าจะรันบนเครื่อง Dev, CI/CD Server, หรือ Production ก็ตาม
- ลักษณะข้อมูล: ระบุเวอร์ชันแบบตายตัว (Exact Versions) เช่น
สรุปโดยย่อ: composer.json บอกว่า “เราอยากใช้อะไรบ้าง” ส่วน composer.lock บอกว่า “ณ ตอนนี้ เรากำลังใช้อะไรอยู่จริงๆ และมันคือเวอร์ชันไหน 100%”
2. ตัวอย่างการใช้งานและรูปแบบโค้ด (Code Examples): Workflow ที่ถูกต้องในองค์กรมืออาชีพ
เพื่อให้ระบบมีความเสถียรที่สุด การจัดการ Dependency ต้องผ่านขั้นตอนที่ชัดเจน โดยมีเป้าหมายหลักคือ ต้อง Commit ทั้ง composer.json และ composer.lock เข้าสู่ Git เสมอ
Scenario A: การติดตั้งโปรเจกต์ใหม่ หรือการ Deploy บน Server (Production/CI)
เมื่อคุณทำงานบนเซิร์ฟเวอร์ที่เพิ่ง Checkout โค้ดมา (ซึ่งมีทั้งสองไฟล์อยู่แล้ว) คุณจะต้องใช้คำสั่ง composer install เท่านั้น ห้ามใช้ update เด็ดขาด
PHP
PHP
# 1. เข้าไปยัง Root Directory ของโปรเจกต์
cd /var/www/myapp
# 2. ใช้ 'install' เสมอเมื่อมีการ Commit composer.lock มาด้วย
composer install