FiveM Dependency คืออะไร ทำไม Script ถึงต้องใช้
FiveM Dependency คือ Resource หรือ Requirement ที่ Script หนึ่งต้องพึ่งพาเพื่อให้ทำงานได้อย่างถูกต้อง เช่น Script ร้านค้าอาจต้องใช้ Framework, Inventory, ox_lib และ oxmysql ร่วมกัน หากขาดตัวใดตัวหนึ่ง Script อาจไม่ Start หรือ Start ได้แต่บางระบบใช้งานไม่ได้
ตัวอย่างง่าย ๆ
my-script
↓
ต้องใช้
ox_lib
↓
ถ้าไม่มี ox_lib
my-script อาจทำงานไม่ได้
FiveM สามารถกำหนด Dependency อย่างเป็นทางการผ่านไฟล์ fxmanifest.lua เช่น
dependency 'ox_lib'
หรือหากต้องใช้หลาย Resource
dependencies {
'ox_lib',
'oxmysql'
}
นอกจากนี้ Dependency ของ FiveM ไม่ได้หมายถึง Resource อย่างเดียว เพราะ Resource Manifest ยังสามารถกำหนด Requirement เช่น Server Build, OneSync, Game Build หรือ Native ได้ด้วย
ดังนั้นถ้ากำลังติดตั้ง Script FiveM แล้วเจอคำว่า dependency, dependencies, requires หรือ requirements สิ่งเหล่านี้คือข้อมูลที่ไม่ควรมองข้าม
① Dependency คืออะไรแบบเข้าใจง่าย
ลองคิดว่า Script FiveM เป็นบ้านหนึ่งหลัง
บ้านอาจต้องใช้
ไฟฟ้า
น้ำ
โครงสร้าง
ประตู
ระบบรักษาความปลอดภัย
จึงจะใช้งานได้ครบ
Script FiveM ก็คล้ายกัน
ตัวอย่าง
Police Script
↓
Framework
↓
Inventory
↓
Target
↓
Database
↓
Dispatch
ถ้า Police Script ถูกออกแบบให้ใช้ ox_target แต่ Server ไม่มี ox_target ระบบ Interaction บางส่วนอาจไม่แสดง
หรือ Script ต้องใช้ oxmysql เพื่ออ่านข้อมูลผู้เล่นจาก Database แต่ Database Connector ไม่ทำงาน ระบบที่ต้อง Query ข้อมูลก็อาจ Error
Dependency จึงเป็น ส่วนประกอบที่ Script อื่นต้องใช้เพื่อทำงานต่อ
② ทำไม Script FiveM ถึงต้องมี Dependency
ถ้าผู้พัฒนาต้องเขียนทุกระบบใหม่ทั้งหมดในทุก Script จะเสียเวลาและเกิด Code ซ้ำจำนวนมาก
ตัวอย่างเช่น Script 50 ตัวต้องการ Menu
แทนที่ Developer ทุกคนจะสร้าง Menu System ใหม่ทั้งหมด สามารถใช้ Library กลางได้
เช่นแนวคิด
ox_lib
↓
Menu
Callback
Context
Dialog
Notification
Utility
↓
Script หลายตัวเรียกใช้
หรือ Script จำนวนมากต้องเข้าถึง Database
แทนที่จะสร้าง Database Connector ใหม่ทุก Script ก็สามารถใช้
oxmysql
ร่วมกันได้
ข้อดีคือ
ลด Code ซ้ำ
พัฒนาเร็วขึ้น
ใช้มาตรฐานร่วมกัน
Update ระบบกลางได้ง่าย
Script เชื่อมต่อกันได้สะดวก
ลดความซับซ้อนของแต่ละ Resource
นี่คือเหตุผลที่ FiveM ecosystem มี Library, Framework และ Core Resources จำนวนมาก
③ dependency ใน fxmanifest.lua คืออะไร
FiveM รองรับ Directive
dependency 'resource_name'
ใน fxmanifest.lua
ตัวอย่าง
fx_version 'cerulean'
game 'gta5'
dependency 'ox_lib'
client_script 'client.lua'
server_script 'server.lua'
ความหมายคือ Resource ปัจจุบันต้องการ Resource
ox_lib
ให้ถูกโหลดก่อน
ตามเอกสาร Cfx.re dependency ใช้กำหนดให้ Resource ที่ระบุถูกโหลดก่อน Resource ปัจจุบัน
ดังนั้น FiveM เองจะรู้ว่า Resource มีความสัมพันธ์กันอย่างไรในระดับ Manifest
④ dependencies ใช้เมื่อมีหลายตัว
ถ้าต้องใช้ Resource หลายตัว สามารถใช้
dependencies {
'resource-a',
'resource-b',
'resource-c'
}
ตัวอย่าง
dependencies {
'ox_lib',
'oxmysql',
'ox_target'
}
แนวคิดคือ
ox_lib
oxmysql
ox_target
↓
ต้องพร้อม
↓
my-script
แต่ต้องระวังว่า Script ทุกตัวไม่ได้ประกาศ Dependency ทั้งหมดไว้ใน Manifest เสมอ
บาง Dependency อาจถูกระบุเฉพาะใน Documentation หรือ Config
⑤ Dependency ไม่ได้อยู่ใน fxmanifest.lua เสมอไป
สมมติ Script มี Config
Config.Inventory = 'ox_inventory'
Config.Target = 'ox_target'
แต่ fxmanifest.lua ไม่ได้ประกาศ
dependency 'ox_inventory'
Script อาจ Start ได้
แต่เมื่อผู้เล่นเปิด Inventory หรือใช้ Target ระบบจึงเกิด Error
ดังนั้นต้องอ่านทั้ง
fxmanifest.lua
README
Documentation
Config
Installation Guide
ไม่ควรดู Manifest อย่างเดียวแล้วสรุปว่า Dependency มีเพียงเท่านั้น
⑥ Hard Dependency กับ Optional Dependency ต่างกันอย่างไร
ในทางปฏิบัติสามารถแบ่ง Dependency ที่พบใน Script ได้ประมาณ 2 กลุ่ม
Hard Dependency
Resource ต้องมีจึงทำงานได้
ตัวอย่าง
dependency 'ox_lib'
ถ้าขาด Resource นี้ Script อาจไม่ Start
Optional Dependency
Script รองรับระบบเสริม แต่ไม่จำเป็นต้องใช้ทุก Server
ตัวอย่าง
ox_target
qb-target
Custom Target
Script อาจให้เลือกหนึ่งในหลายระบบผ่าน Config
เช่น
Config.Target = 'ox_target'
กรณีนี้ไม่จำเป็นต้องติดตั้ง Target ทุกตัว
ต้องติดตั้งเฉพาะตัวที่ Script ถูกตั้งค่าให้ใช้
⑦ Framework ถือเป็น Dependency หรือไม่
ถือเป็น Dependency สำคัญสำหรับ Script RP จำนวนมาก
ตัวอย่าง Framework ได้แก่
ESX
QBCore
Qbox
Script อาจเรียก Framework เพื่อดึงข้อมูล
Player
Job
Money
Identifier
Inventory
Metadata
Permission
ตัวอย่างเชิงแนวคิด
Garage Script
↓
Framework
↓
Player Data
↓
Vehicle Ownership
หากนำ QBCore Script ไปใช้กับ ESX โดยไม่มี Compatibility Layer Script ก็อาจไม่สามารถดึง Player Data ได้
ดังนั้นก่อนติดตั้ง Script ต้องตรวจว่า Script รองรับ Framework ใด
⑧ ESX Dependency คืออะไร
ESX Script อาจต้องใช้ Core Resource ของ ESX และ Resource เสริมอื่น ๆ
ตัวอย่างเชิงแนวคิด
ESX Job Script
↓
ESX Core
↓
Database
↓
Inventory
↓
Optional Library
Script บางตัวสร้างสำหรับ ESX Legacy รุ่นใหม่
ถ้านำไปใช้กับ ESX รุ่นเก่ามาก อาจพบปัญหา Function หรือ Event ไม่ตรงกัน
ดังนั้นคำว่า
ESX Compatible
ยังไม่เพียงพอ
ควรตรวจ Version และ Documentation ด้วย
⑨ QBCore Dependency คืออะไร
QBCore Script มักพึ่งพา qb-core และอาจมี Resource เสริม เช่น
qb-target
qb-menu
qb-input
Inventory
Database
ขึ้นอยู่กับ Script
ตัวอย่าง
qb-job-script
↓
qb-core
↓
Player Data
Jobs
Functions
ถ้า qb-core ไม่พร้อม Script ที่เรียก Core Object หรือ Functions ก็อาจ Error
ดังนั้น Start Order ของ Core จึงสำคัญ
⑩ Qbox Dependency ต้องตรวจอะไร
Qbox มี Core และ ecosystem ของตัวเอง และใช้งานร่วมกับ Resource จาก OX ecosystem หลายตัว
Script สำหรับ Qbox อาจต้องการ Resource เช่น
qbx_core
ox_lib
oxmysql
ox_inventory
ox_target
ขึ้นอยู่กับ Script
ถ้านำ QBCore Script มาใช้บน Qbox ต้องตรวจ Compatibility ของ Script นั้นโดยตรง
แม้ Qbox มี Compatibility สำหรับ QB ecosystem หลายส่วน แต่ไม่ได้หมายความว่า Script ทุกตัวจะเข้ากันได้ 100%
⑪ ox_lib เป็น Dependency ทำอะไร
ox_lib เป็น Library ที่ Script FiveM จำนวนมากใช้เป็นเครื่องมือกลาง
Script อาจใช้ความสามารถ เช่น
Context Menu
Input Dialog
Alert Dialog
Callback
Zones
Notifications
Utility Functions
ดังนั้นเมื่อ Script ระบุ
Requires ox_lib
หมายความว่า Code ของ Script อาจเรียก Function จาก ox_lib
ถ้าไม่มี Resource นี้ การลบคำว่า Dependency ออกจาก Manifestไม่ได้สร้าง Function เหล่านั้นขึ้นมา
Script จึงยังมีโอกาส Error อยู่ดี
⑫ oxmysql เป็น Dependency ทำอะไร
oxmysql เป็น Resource ที่ใช้ช่วยเชื่อม FiveM Scripts กับ MySQL/MariaDB Database
Script ที่ต้องเก็บข้อมูล เช่น
Phone
Banking
Garage
Housing
Inventory
Character
Jobs
อาจต้องใช้ Database
ตัวอย่าง
Garage
↓
oxmysql
↓
Database
↓
ข้อมูลรถผู้เล่น
ถ้า oxmysql ไม่ทำงาน Resource หลักอาจ Start ได้บางส่วน แต่ Query Database จะล้มเหลว
ดังนั้นต้องตรวจทั้ง Resource และ Database Connection
⑬ ox_target เป็น Dependency ทำอะไร
Target System ใช้สร้าง Interaction กับ
NPC
Entity
Vehicle
Object
Zone
ตัวอย่าง
เดินเข้าใกล้ NPC
↓
ox_target
↓
แสดงตัวเลือก
↓
เปิด Job Menu
ถ้า Script ตั้ง
Config.Target = 'ox_target'
แต่ Server ไม่มี ox_target
Resource อาจ Started ได้ แต่ผู้เล่นมองไม่เห็น Interaction
นี่เป็นตัวอย่างชัดเจนของ Dependency ที่อาจทำให้เกิดอาการ
Script Start แต่ใช้งานไม่ได้
⑭ Inventory เป็น Dependency ได้อย่างไร
Script จำนวนมากเชื่อมกับ Inventory
ตัวอย่าง
Crafting Script
↓
ตรวจ Item
↓
Remove Item
↓
Add Item
↓
Inventory
หรือ
Police Script
↓
Search Player
↓
เปิด Inventory
หาก Script สร้างสำหรับ Inventory A แต่ Server ใช้ Inventory B ต้องมี Integration ที่รองรับ
Resource สามารถ Start ได้ แต่ระบบ Item อาจใช้ไม่ได้
ดังนั้น Inventory Compatibility เป็นหนึ่งในสิ่งที่ควรตรวจทุกครั้งก่อนซื้อหรือติดตั้ง Script
⑮ Voice Script ก็สามารถเป็น Dependency ได้
ระบบบางตัวต้องเชื่อมกับ Voice เช่น
Radio
Phone Calls
Police Radio
Proximity Voice
อาจต้องใช้ Resource เช่น pma-voice
ตัวอย่าง
Phone Script
↓
Call System
↓
Voice Resource
ถ้า Voice Integration ไม่ตรง การเปิด Phone อาจทำงานปกติ แต่ Voice Call ใช้ไม่ได้
ดังนั้น Script หนึ่ง Resource สามารถมี Dependency หลายระดับและหลายประเภท
⑯ Dependency มีลำดับชั้นได้
สมมติ
Script A
↓
ต้องใช้ Script B
Script B
↓
ต้องใช้ Library C
Library C
↓
ต้องใช้ Requirement D
ถ้า D มีปัญหา
D ล้ม
↓
C ล้ม
↓
B ล้ม
↓
A ล้ม
นี่เป็นเหตุผลว่าทำไม FiveM Server บางครั้งมี Error 30 Resource พร้อมกัน แต่ Root Cause อาจมีเพียง Core Resource เดียว
เมื่อตรวจ Error ควรหา Dependency ล่างสุดที่ล้มเหลวก่อน
⑰ Start Order เกี่ยวอะไรกับ Dependency
Resource ที่ถูกพึ่งพาควรพร้อมก่อน Resource ที่เรียกใช้งาน
ตัวอย่าง
ensure oxmysql
ensure ox_lib
ensure my-script
ถ้า my-script ต้องใช้ทั้งสองตัว
การเขียนกลับด้าน เช่น
ensure my-script
ensure ox_lib
ensure oxmysql
อาจทำให้ Script Initialize ตอน Dependency ยังไม่พร้อม
อาการที่พบบ่อยคือ
Restart Server → Script ใช้ไม่ได้
แต่หลัง Server เปิดเสร็จแล้วสั่ง
ensure my-script
ใหม่กลับใช้งานได้
นี่เป็นสัญญาณสำคัญว่า Start Order อาจผิด
⑱ Dependency ใน server.cfg ควรเรียงอย่างไร
ไม่มีลำดับเดียวที่ใช้ได้กับทุก Server แต่สามารถคิดเป็น Layer ได้
ตัวอย่างเชิงแนวคิด
Database
↓
Core / Framework
↓
Libraries
↓
Inventory / Target
↓
Gameplay Systems
↓
Jobs / Custom Scripts
เช่น
ensure oxmysql
ensure framework-resource
ensure ox_lib
ensure ox_target
ensure inventory-resource
ensure my-job
ensure my-garage
แต่ควรยึด Documentation ของ Framework และ Script จริงเป็นหลัก
อย่าจัดลำดับเพียงเพราะชื่อ Category ดูเหมาะสม
⑲ Category อาจทำให้ Dependency ซ่อนอยู่
สมมติ server.cfg
ensure [scripts]
ensure [core]
ใน [scripts] มี Script ที่ต้องใช้ Resource ใน [core]
Script อาจถูกเรียกก่อน Core
ควรคิดถึง Dependency ระหว่าง Category ด้วย
เช่น
ensure [core]
ensure [libraries]
ensure [scripts]
อย่างไรก็ตาม Resource ภายใน Category ก็อาจมี Dependency ต่อกันเองอีก
ดังนั้น Server ขนาดใหญ่ควรมีโครงสร้าง Resource ที่ออกแบบตาม Dependency จริง
⑳ Dependency Version สำคัญหรือไม่
สำคัญมาก
บางครั้ง Server มี Resource ที่ Script ต้องการครบ
เช่น
ox_lib ✓
oxmysql ✓
Framework ✓
แต่ยัง Error
เพราะ Script ต้องการ API จาก Version ใหม่กว่า
ตัวอย่าง
Script ใหม่
↓
เรียก Export ใหม่
↓
Dependency เก่าไม่มี
↓
No such export
กรณีนี้ FiveM อาจไม่ขึ้น Missing Dependency เพราะ Resource มีอยู่จริง
แต่เกิด Compatibility Error แทน
ดังนั้นต้องตรวจทั้ง
Dependency มีหรือไม่
และ
Dependency Version รองรับหรือไม่
㉑ No Such Export เกี่ยวกับ Dependency อย่างไร
ตัวอย่าง
my-script
↓
เรียก Export X
↓
ox_lib
ถ้า ox_lib Start อยู่ แต่ Version ที่ติดตั้งไม่มี Export X
อาจขึ้น
No such export
นี่ไม่ใช่ Missing Dependency แบบตรง ๆ เพราะ Dependency มีอยู่
แต่เป็น Dependency API ไม่ Compatible
ให้ตรวจ
Version ของ Script
Version ของ Dependency
Changelog
Export Name
Documentation
ก่อนแก้ Code
㉒ Update Script แล้วมี Dependency ใหม่
กรณีนี้พบบ่อย
Version เดิม
my-script v1
↓
Framework
Version ใหม่
my-script v2
↓
Framework
ox_lib
ถ้าอัปเดต Script อย่างเดียว จะเกิด Error
ดังนั้นก่อน Update ต้องอ่าน
Changelog
Requirements
Dependencies
Migration Guide
ทุกครั้ง
โดยเฉพาะ Major Version
㉓ Update Dependency แล้ว Script เก่าใช้ไม่ได้
ปัญหาสามารถเกิดย้อนกลับได้เช่นกัน
Script เก่า
↓
ใช้ API เก่า
↓
Update Dependency
↓
API เปลี่ยน
↓
Script Error
ดังนั้นการ Update Core Library ไม่ควรทำเพราะเห็น Version ใหม่แล้ว Update ทันทีบน Production
ควร
Backup
↓
อ่าน Breaking Changes
↓
Test Server
↓
ทดสอบ Resource ลูก
↓
ค่อย Update Production
Dependency เพียงตัวเดียวอาจถูกใช้โดย Script หลายสิบตัว
㉔ Runtime Constraint ก็ถือเป็น Dependency
FiveM dependency รองรับ Requirement ที่ไม่ได้เป็น Resource ด้วย
ตัวอย่างจากรูปแบบที่ Cfx.re รองรับ
dependencies {
'/server:4500',
'/onesync',
'/gameBuild:h4'
}
ดังนั้น Dependency สามารถหมายถึง
Server Build
OneSync
Game Build
Policy
Native
ไม่ใช่เพียง Script อีกตัวหนึ่ง
นี่เป็นรายละเอียดที่คนเริ่ม FiveM Server มักไม่รู้
㉕ /server คืออะไร
ตัวอย่าง
dependency '/server:4500'
หมายถึง Resource ต้องการ Server Build ขั้นต่ำตามตัวเลขที่กำหนด
ถ้า FXServer เก่าเกิน Requirement Resource อาจไม่สามารถทำงานได้
วิธีแก้ควรเป็น
ตรวจ Artifact/Server Build
↓
Backup
↓
Update Server
↓
ทดสอบ Resource
ไม่ใช่ลบ Requirement ออกจาก Manifest โดยไม่รู้เหตุผล
㉖ /onesync คืออะไร
Manifest สามารถกำหนด
dependency '/onesync'
เพื่อบอกว่า Resource ต้องการ State Awareness
หาก Environment ของ Server ไม่ตรง Resource ก็อาจไม่ผ่าน Requirement
ควรตรวจ OneSync Configuration และ Documentation ของ Resource
อย่าข้าม Requirement เพราะ Script อาจใช้ Feature ที่พึ่งพา OneSync จริง
㉗ /gameBuild คืออะไร
Resource บางตัวต้องการ Game Build ขั้นต่ำ
ตัวอย่าง
dependency '/gameBuild:h4'
ตามเอกสาร Cfx.re Constraint แบบนี้ใช้กำหนด Minimum Game Build ได้
Resource ประเภท
Map
MLO
Vehicle
Script ที่ใช้ Native ใหม่
Content จาก GTA V Update ใหม่
อาจต้องใช้ Game Build เฉพาะ
ถ้า Build ต่ำเกินไป การแก้ Script อย่างเดียวอาจไม่ช่วย
㉘ /native คืออะไร
Resource สามารถกำหนด Requirement ว่า Server ต้องรองรับ Server-side Native บางตัว
รูปแบบเช่น
dependency '/native:0xE27C97A0'
ถ้า Server Environment ไม่รองรับ Native ที่กำหนด Resource ก็อาจไม่สามารถทำงานตาม Requirement
นี่แสดงให้เห็นว่า Dependency ของ FiveM สามารถตรวจ Capability ของ Server ได้ ไม่ใช่แค่ชื่อ Resource
㉙ /policy คืออะไร
อีก Runtime Constraint คือ Policy Requirement
ตัวอย่างรูปแบบ
dependency '/policy:subdir_file_mapping'
ใช้กำหนดว่า Server Key ต้องได้รับ Policy ที่เกี่ยวข้อง
กรณีนี้การติดตั้ง Resource เพิ่มไม่ได้แก้ปัญหา เพราะ Requirement อยู่ที่ Server Policy
ต้องอ่านข้อความ Error และ Documentation ให้ตรงกับประเภท Dependency
㉚ ทำไมไม่ควรลบ dependency ออกจาก fxmanifest.lua
สมมติ Script มี
dependency 'ox_lib'
แต่ Server ไม่มี ox_lib
ถ้าลบบรรทัดนี้
Missing Dependency อาจไม่ขึ้นแบบเดิม
แต่ Code ภายในยังอาจเรียก
ox_lib functions
exports
callbacks
ผลลัพธ์อาจกลายเป็น Error อื่น เช่น
No such export
attempt to call a nil value
SCRIPT ERROR
จึงเป็นการ “ซ่อนตัวตรวจสอบ” ไม่ใช่แก้ต้นเหตุ
แนวทางของ comsiam คือ Dependency ที่ Developer ระบุควรถูกมองเป็น Requirement จนกว่าจะพิสูจน์ได้จาก Documentation ว่าเป็น Optional
㉛ Rename Dependency ได้หรือไม่
ทางเทคนิค Resource สามารถตั้งชื่อได้หลายแบบ แต่ใน ecosystem จริง Resource อื่นอาจอ้างชื่อไว้โดยตรง
ตัวอย่าง
dependency 'ox_lib'
ถ้า Rename Folder เป็น
my-ox-lib
Resource ที่กำหนด ox_lib ก็จะหา Dependency เดิมไม่เจอ
นอกจากนี้ Code อาจมี
exports['ox_lib']
หรือ Reference ชื่อ Resourceอื่นอีก
ดังนั้น Core Resource ไม่ควร Rename เพียงเพื่อจัดชื่อให้สวย
㉜ Dependency Folder ซ้อนทำให้เกิดอะไร
ตัวอย่างผิด
resources/
└── ox_lib/
└── ox_lib/
└── fxmanifest.lua
Resource ที่ FiveM Parse อาจไม่ตรงกับชื่อที่ Script ต้องการ
ควรเป็น
resources/
└── ox_lib/
└── fxmanifest.lua
หลังแก้ใช้
refresh
ensure ox_lib
แล้วตรวจ Console
นี่เป็นหนึ่งในปัญหาที่พบมากหลังแตก ZIP
㉝ Resource มี Dependency แต่ FiveM หาไม่เจอ
ให้ตรวจตามลำดับ
Dependency มี Folder?
↓
ชื่อถูก?
↓
fxmanifest.lua มี?
↓
Folder ซ้อน?
↓
Server Data ถูก?
↓
refresh แล้ว?
↓
Dependency Start ได้?
ถ้าตอบได้ครบ จะสามารถแยกได้ว่าเป็น
Resource Discovery Problem
หรือ
Dependency Runtime Problem
สองอย่างนี้ต้องแก้คนละทาง
㉞ Dependency อยู่คนละ txAdmin Profile
ถ้ามี
Production
Test Server
Development
หลาย Profile ต้องระวังว่า Resource ที่ติดตั้งอยู่ใน Profile ไหน
ตัวอย่าง
Test Server
→ มี ox_lib
Production
→ ไม่มี ox_lib
แต่กำลังเปิด Production
Script ก็ยัง Missing Dependency
ตรวจ Server Data Path และ Profile ที่ Run จริงทุกครั้งเมื่อไฟล์ดูเหมือนครบแต่ FiveM หาไม่พบ
㉟ Script Started แล้ว Dependency ยังมีปัญหาได้ไหม
ได้
Dependency บางตัวเป็น Optional/Integration Dependency ไม่ใช่ Hard Dependency
ตัวอย่าง Script Start ได้ แต่ Config ตั้ง
Config.Inventory = 'ox_inventory'
เมื่อผู้เล่นเปิด Stash ระบบจึงเรียก Inventory
ถ้า Inventory ไม่พร้อม Error จะเกิดตอนนั้น
ดังนั้น
Started resource
ไม่ได้แปลว่า Dependency ของทุก Feature ทำงานครบ
ต้องทดสอบ Workflow จริง
㊱ วิธีดูว่า Script ใช้ Dependency อะไรบ้าง
ตรวจ 5 จุดหลัก
1. README
ค้นหา
Requirements
Dependencies
Installation
2. fxmanifest.lua
ค้นหา
dependency
dependencies
3. config.lua
ค้นหา
Framework
Inventory
Target
Notification
Voice
4. Source Code
หากเปิดได้ ค้นหาชื่อ Resource เช่น
ox_lib
ox_inventory
qb-core
qbx_core
5. Documentation
ดู Compatibility Matrix และ Version Requirement
วิธีนี้จะได้ภาพ Dependency ที่ครบกว่าดู Manifest อย่างเดียว
㊲ วิธีจัด Dependency ของ Server ให้อ่านง่าย
Server ใหญ่ควรแบ่ง Resource เป็น Category
ตัวอย่าง
[database]
[framework]
[libraries]
[inventory]
[target]
[jobs]
[systems]
แล้วจัด server.cfg ให้สอดคล้องกับ Dependency
ตัวอย่างเชิงแนวคิด
# Database
ensure oxmysql
# Framework
ensure [framework]
# Libraries
ensure ox_lib
# Target / Inventory
ensure ox_target
ensure inventory-resource
# Gameplay
ensure [jobs]
ensure [systems]
ไม่จำเป็นต้องใช้โครงสร้างนี้เหมือนกันทุก Server แต่ควรมี Logic ที่คนดูแลคนอื่นอ่านแล้วเข้าใจ
㊳ Dependency เยอะทำให้ Server ช้าหรือไม่
จำนวน Dependency ไม่ได้เป็นตัวชี้วัด Performance โดยตรง
Script ที่ใช้ Library หลายตัวแต่เขียนดีอาจเบากว่า Standalone Script ที่มี Loop หนักมาก
ควรดู
CPU
Resmon
Server Profiler
Database Queries
Network
Script Design
มากกว่าการนับจำนวน Dependency
ดังนั้นไม่ควรหลีกเลี่ยง Dependency ทุกชนิดเพียงเพราะกลัว Server หนัก
บาง Library ช่วยลด Code ซ้ำและทำให้ระบบดูแลง่ายขึ้นด้วยซ้ำ
㊴ Dependency มากเกินไปมีข้อเสียอะไร
แม้ Dependency จะมีประโยชน์ แต่ Dependency Chain ที่ซับซ้อนก็มีข้อเสีย
เช่น
Script A
↓
Library B
↓
Core C
↓
Resource D
ถ้า D มีปัญหา A, B และ C อาจได้รับผลกระทบ
ข้อเสียที่ควรระวัง ได้แก่
Update ยากขึ้น
Version Conflict
Startup Order ซับซ้อน
Debug ยากขึ้น
Core Failure กระทบหลาย Script
Migration ยากขึ้น
ดังนั้นเลือก Script ควรดู Dependency ด้วย ไม่ใช่ดู Feature อย่างเดียว
㊵ Standalone Script ไม่มี Dependency จริงหรือไม่
ไม่เสมอไป
คำว่า Standalone มักหมายถึง Script ไม่พึ่ง Framework ใหญ่ เช่น ESX หรือ QBCore
แต่ยังสามารถต้องใช้
ox_lib
Database
Voice
Target
UI Library
ได้
ดังนั้น
Standalone
≠
Zero Dependencies
ต้องอ่าน Requirements ของ Script ทุกครั้ง
㊶ Dependency กับ Framework ต่างกันอย่างไร
Framework เป็นระบบ Core ขนาดใหญ่
เช่น
ESX
QBCore
Qbox
ส่วน Dependency เป็นคำกว้างกว่า
Framework สามารถเป็น Dependency ได้
Library ก็เป็น Dependency ได้
Database Connector ก็เป็น Dependency ได้
แม้แต่ Server Build ก็สามารถเป็น Runtime Dependency ได้
ดังนั้นความสัมพันธ์คือ
Framework
สามารถเป็น
Dependency
แต่
Dependency
ไม่ได้หมายถึง Framework เสมอไป
㊷ Dependency กับ Export ต่างกันอย่างไร
Dependency คือการบอกว่า Resource หนึ่งต้องพึ่งพาอีก Resource
ส่วน Export คือ Function ที่ Resource หนึ่งเปิดให้ Resource อื่นเรียกใช้
ตัวอย่าง
Resource A
↓
Dependency
Resource B
↓
Resource B มี Export
↓
A เรียก Export ของ B
ถ้า B ไม่มี
Missing Dependency
อาจเกิด
แต่ถ้า B มีอยู่แล้ว แต่ Export ที่ A เรียกไม่มี
อาจเกิด
No such export
สองเรื่องเกี่ยวข้องกันแต่ไม่เหมือนกัน
㊸ Dependency กับ Event ต่างกันอย่างไร
Event เป็นวิธีสื่อสารหรือส่งเหตุการณ์ระหว่างส่วนต่าง ๆ ของ Script
Dependency คือ Requirement ว่า Resource ต้องการอะไร
ตัวอย่าง
my-script
↓
Dependency = Framework
↓
ใช้ Event ของ Framework
↓
รับ Player Data
ถ้า Framework ไม่มี Resource อาจไม่พร้อม
ถ้า Framework มีแต่ Event API เปลี่ยน Script อาจเกิด Compatibility Error
ดังนั้น Error อาจเกิดได้ทั้งระดับ Dependency และ API
㊹ วิธีแก้ Dependency Error แบบเป็นระบบ
ใช้ขั้นตอนนี้
ขั้นที่ 1
อ่าน Error และจดชื่อ Dependency
ขั้นที่ 2
ตรวจ
resources/dependency-name/
ขั้นที่ 3
ตรวจ
fxmanifest.lua
ขั้นที่ 4
อ่าน Documentation เพื่อดู Version Requirement
ขั้นที่ 5
ใช้
refresh
ขั้นที่ 6
ใช้
ensure dependency-name
ขั้นที่ 7
แก้ Error ของ Dependency ให้หมดก่อน
ขั้นที่ 8
จัด server.cfg ให้ Dependency Start ก่อน
ขั้นที่ 9
ใช้
ensure my-script
ขั้นที่ 10
ทดสอบ Feature จริง
อย่าหยุดเพียงเพราะ Resource ขึ้น Started
㊺ ถ้ามี Dependency หลายตัวควรติดตั้งทีละตัว
ควร
สมมติ Script ต้องใช้
oxmysql
ox_lib
ox_target
inventory
อย่าติดตั้งทั้งหมดแล้ว Restart Serverเพียงครั้งเดียวหากเป็นมือใหม่
ควร
ติดตั้ง oxmysql
↓
ทดสอบ
ติดตั้ง ox_lib
↓
ทดสอบ
ติดตั้ง ox_target
↓
ทดสอบ
ติดตั้ง Script หลัก
↓
ทดสอบ
เมื่อเกิด Error จะรู้ทันทีว่าเริ่มจาก Resource ใด
นี่เป็นวิธีที่ comsiam แนะนำสำหรับ Server ใหม่และช่วง Development
㊻ Checklist FiveM Dependency
ก่อนติดตั้ง Script ให้ตรวจ
Framework
รองรับ ESX/QBCore/Qbox หรือไม่
Version ตรงหรือไม่
Libraries
ต้องใช้
ox_libหรือไม่ต้องใช้ Library อื่นหรือไม่
Database
ต้องใช้
oxmysqlหรือไม่ต้อง Import SQL หรือไม่
Gameplay Integration
Inventory
Target
Voice
Notification
Menu
Dispatch
Runtime
Server Build
OneSync
Game Build
Native
Policy
Resource
ชื่อ Folder ถูก
fxmanifest.luaมีFolder ไม่ซ้อน
Start Order ถูก
ถ้าตรวจครบก่อนติดตั้ง จะลด Missing Dependency และ Compatibility Error ได้มาก
สรุป FiveM Dependency คืออะไร
FiveM Dependency คือ Resource หรือ Requirement ที่ Resource อื่นต้องใช้เพื่อให้สามารถทำงานได้อย่างถูกต้อง
ตัวอย่างใน fxmanifest.lua
dependency 'ox_lib'
หรือ
dependencies {
'ox_lib',
'oxmysql'
}
หมายความว่า Resource ปัจจุบันต้องพึ่งพา Resource ที่ระบุ และ FiveM จะใช้ข้อมูลนี้ในการจัด Requirement ของ Resource
Dependency ที่พบใน FiveM Server มีได้หลายประเภท เช่น
Framework
Library
Database
Inventory
Target
Voice
Resource อื่น
Server Build
OneSync
Game Build
Native
Policy
ดังนั้นหาก Script ขึ้น Missing Dependency สิ่งที่ควรทำคือ ติดตั้งและทำให้ Dependency ที่ต้องการทำงานได้ก่อน ไม่ใช่ลบ dependency ออกจาก fxmanifest.lua
อีกเรื่องสำคัญคือ Dependency มีอยู่ไม่ได้แปลว่าจะ Compatible เสมอไป เพราะ Version ของ Library หรือ Framework อาจไม่ตรงกับ Script และนำไปสู่ Error อย่าง No such export หรือ Function ที่หายไปได้
แนวทางของ comsiam คือก่อนติดตั้ง Script ทุกตัวควรอ่าน Requirements และวาด Dependency Chain คร่าว ๆ ว่า Resource นี้พึ่งอะไรบ้าง วิธีนี้ทำให้จัด server.cfg และแก้ Error ได้ง่ายขึ้นมาก
สำหรับ FiveM Server ขนาดใหญ่ comsiam แนะนำให้มอง Dependency เป็นโครงสร้างหลักของ Server ไม่ใช่ไฟล์เสริม เพราะ Core Resource เพียงตัวเดียว เช่น Framework, Library หรือ Database Layer สามารถส่งผลต่อ Script จำนวนมากได้พร้อมกัน หากวาง Dependency และ Start Order ดีตั้งแต่แรก Server จะดูแลและอัปเดตง่ายขึ้นอย่างเห็นได้ชัด
Comments
Post a Comment