การกำหนด Dependencies ใน composer.json
ในบทที่แล้ว เราได้เรียนรู้เกี่ยวกับโครงสร้างพื้นฐานของไฟล์ composer.json และองค์ประกอบสำคัญต่างๆ เช่น name, description, require และ autoload ในบทนี้ เราจะเจาะลึกถึงการกำหนด dependencies ในส่วนของ require ซึ่งเป็นส่วนที่บอก Composer ว่าโปรเจกต์ของเราต้องการ package อะไรบ้าง และเวอร์ชันไหน
`require` คืออะไร?
require คือส่วนหนึ่งของไฟล์ composer.json ที่ใช้ระบุ dependencies หรือ package ที่โปรเจกต์ของเราต้องการใช้งาน เปรียบเสมือนรายการส่วนผสมที่จำเป็นสำหรับทำอาหาร หากไม่มีส่วนผสมเหล่านี้ โปรเจกต์ของเราก็อาจทำงานไม่ได้ตามที่คาดหวัง
dependencies เหล่านี้มักจะเป็น library หรือ package ที่มี code ที่ช่วยให้เราทำงานบางอย่างได้ง่ายขึ้น เช่น การจัดการฐานข้อมูล, การสร้าง API, หรือการจัดการ user authentication
โครงสร้างของ `require`
require เป็น JSON object ที่มี key เป็นชื่อของ package และ value เป็นเวอร์ชันของ package นั้นๆ ตัวอย่าง:
{
"require": {
"monolog/monolog": "1.0.*"
}
}
จากตัวอย่างข้างต้น เรากำลังบอก Composer ว่าโปรเจกต์ของเราต้องการ package ชื่อ monolog/monolog เวอร์ชัน 1.0.* เราจะอธิบายเรื่องเวอร์ชันอย่างละเอียดในหัวข้อถัดไป
ชื่อ Package (Package Name)
ชื่อ package ใน Composer มีรูปแบบ vendor/package โดยที่:
vendorคือชื่อของผู้พัฒนาหรือองค์กรที่สร้าง package นั้นๆpackageคือชื่อของ package นั้นๆ
ตัวอย่างเช่น monolog/monolog หมายถึง package ชื่อ monolog ที่พัฒนาโดย monolog (ซึ่งเป็นชื่อของ vendor หรือองค์กร)
เวอร์ชันของ Package (Package Version)
การกำหนดเวอร์ชันของ package เป็นสิ่งสำคัญ เพื่อให้ Composer ทราบว่าเราต้องการ package เวอร์ชันไหนมาใช้งาน การกำหนดเวอร์ชันที่ถูกต้องจะช่วยให้โปรเจกต์ของเราทำงานได้อย่างราบรื่นและหลีกเลี่ยงปัญหาความเข้ากันไม่ได้ (compatibility issues)
Composer รองรับการกำหนดเวอร์ชันที่หลากหลาย ซึ่งเราจะเรียกสิ่งเหล่านี้ว่า "constraints" หรือข้อจำกัดในการเลือกเวอร์ชัน
Version Constraints (ข้อจำกัดของเวอร์ชัน)
Version constraints ช่วยให้เรามีความยืดหยุ่นในการกำหนดเวอร์ชันของ package ที่ต้องการใช้งาน Composer จะพยายามหาเวอร์ชันที่ตรงตาม constraints ที่เรากำหนดไว้ หากไม่พบเวอร์ชันที่ตรงตามเงื่อนไข Composer จะแจ้ง error ให้เราทราบ
ต่อไปนี้เป็นตัวอย่างของ version constraints ที่พบบ่อย:
- เวอร์ชันที่แน่นอน (Exact Version):
- ช่วงของเวอร์ชัน (Version Range):
- Wildcard Version:
- Tilde Operator (~):
- Caret Operator (^):
ระบุเวอร์ชันที่ต้องการใช้งานอย่างเจาะจง เช่น "1.0.0" หมายถึงต้องการ package เวอร์ชัน 1.0.0 เท่านั้น
{
"require": {
"monolog/monolog": "1.0.0"
}
}
ระบุช่วงของเวอร์ชันที่ต้องการใช้งาน เช่น ">=1.0.0 <2.0.0" หมายถึงต้องการ package เวอร์ชัน 1.0.0 ขึ้นไป แต่ไม่เกิน 2.0.0
{
"require": {
"monolog/monolog": ">=1.0.0 <2.0.0"
}
}
ใช้เครื่องหมาย * เพื่อระบุว่าต้องการเวอร์ชันใดๆ ก็ได้ในระดับ minor หรือ patch เช่น "1.0.*" หมายถึงต้องการ package เวอร์ชัน 1.0.x (x เป็นเลขอะไรก็ได้)
{
"require": {
"monolog/monolog": "1.0.*"
}
}
ใช้เครื่องหมาย ~ เพื่อระบุว่าต้องการเวอร์ชันที่เข้ากันได้กับเวอร์ชันที่ระบุ เช่น "~1.0" หมายถึงต้องการ package เวอร์ชัน 1.0 ขึ้นไป แต่ไม่เกิน 2.0 (ไม่รวม 2.0) หรือ "~1.0.0" หมายถึงต้องการ package เวอร์ชัน 1.0.0 ขึ้นไป แต่ไม่เกิน 1.1 (ไม่รวม 1.1)
{
"require": {
"monolog/monolog": "~1.0"
}
}
ใช้เครื่องหมาย ^ เพื่อระบุว่าต้องการเวอร์ชันที่เข้ากันได้กับเวอร์ชันที่ระบุ (แนะนำให้ใช้) เช่น "^1.0" หมายถึงต้องการ package เวอร์ชัน 1.0 ขึ้นไป แต่ไม่เกิน 2.0 (ไม่รวม 2.0) หรือ "^1.0.0" หมายถึงต้องการ package เวอร์ชัน 1.0.0 ขึ้นไป แต่ไม่เกิน 2.0 (ไม่รวม 2.0)
{
"require": {
"monolog/monolog": "^1.0"
}
}
Caret operator (^): แนะนำให้ใช้เพราะจะอัพเดท package เป็นเวอร์ชันล่าสุดที่เข้ากันได้กับเวอร์ชันหลัก (major version) ที่ระบุไว้
ตัวอย่างการกำหนด Dependencies หลาย Package
เราสามารถกำหนด dependencies หลาย package ในไฟล์ composer.json ได้โดยเพิ่ม key-value pair ในส่วนของ require ตัวอย่าง:
{
"require": {
"monolog/monolog": "^1.0",
"guzzlehttp/guzzle": "^7.0"
}
}
จากตัวอย่างข้างต้น เรากำลังบอก Composer ว่าโปรเจกต์ของเราต้องการ package monolog/monolog เวอร์ชัน 1.0 ขึ้นไป และ guzzlehttp/guzzle เวอร์ชัน 7.0 ขึ้นไป
ข้อควรจำในการกำหนด Dependencies
- เลือกเวอร์ชันที่เหมาะสม: พิจารณาความเข้ากันได้ของ package กับโปรเจกต์ของเรา และเลือกเวอร์ชันที่เหมาะสมที่สุด
- ใช้ version constraints ที่เหมาะสม: กำหนด version constraints ที่ยืดหยุ่นพอสมควร เพื่อให้ Composer สามารถอัพเดท package ได้โดยอัตโนมัติ แต่ก็ต้องระวังไม่ให้เวอร์ชันที่อัพเดทมาใหม่ทำให้โปรเจกต์ของเราเสียหาย
- ตรวจสอบ dependencies อย่างสม่ำเสมอ: ตรวจสอบ dependencies ของโปรเจกต์ของเราอย่างสม่ำเสมอ เพื่อให้แน่ใจว่าไม่มีช่องโหว่ด้านความปลอดภัย หรือปัญหาความเข้ากันไม่ได้
สรุป
การกำหนด dependencies ในไฟล์ composer.json เป็นขั้นตอนสำคัญในการจัดการ package ในโปรเจกต์ PHP การระบุ package ที่ต้องการใช้งานและเวอร์ชันที่เหมาะสม จะช่วยให้โปรเจกต์ของเราทำงานได้อย่างราบรื่นและมีประสิทธิภาพ ในบทถัดไป เราจะเรียนรู้วิธีการติดตั้ง dependencies ที่เราได้กำหนดไว้ในไฟล์ composer.json ด้วยคำสั่ง composer install