package.path และ package.cpath
กำหนดเส้นทางค้นหาสำหรับมอดูล Lua และ C
package.path และ package.cpath เป็นบทเรียน Lua Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Lua Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Lua Academy มีบทเรียนทั้งหมด 4 บทเรียน
เนื้อหาของ package.path
package.path คือสตริงของรูปแบบการค้นหาที่คั่นด้วยเครื่องหมายอัฒภาค แต่ละรูปแบบมีตัวแทน ? ซึ่งจะถูกแทนที่ด้วยชื่อโมดูล (โดยเปลี่ยนจุดเป็นตัวคั่นไดเรกทอรี) Lua จะลองใช้แต่ละรูปแบบตามลำดับจนกว่าจะพบไฟล์
print(package.path)
-- ./?.lua;./?.luac;/usr/local/share/lua/5.4/?.lua;...
-- Dots in module names become directory separators
-- require("foo.bar") -> searches for foo/bar.lua
print(("foo.bar"):gsub("%.", "/")) -- foo/barการเพิ่มเส้นทางค้นหา
เติมเส้นทางไว้ด้านหน้าของ package.path เพื่อเพิ่มไดเรกทอรีค้นหา การเติมต่อท้ายจะเพิ่มตำแหน่งที่มีลำดับความสำคัญต่ำกว่า ให้กำหนดค่านี้ก่อนการเรียกใช้ require ใด ๆ ที่ต้องใช้เส้นทางใหม่
-- Add multiple directories
package.path = table.concat({
"./?.lua",
"./lib/?.lua",
"./lib/?/init.lua",
package.path, -- keep existing paths
}, ";")
-- Now require("json") searches:
-- ./json.lua -> ./lib/json.lua -> ./lib/json/init.lua -> ...package.cpath สำหรับส่วนขยาย C
package.cpath คือเส้นทางค้นหาสำหรับโมดูลส่วนขยาย C (ไลบรารีที่ใช้ร่วมกัน: .so บน Linux, .dll บน Windows และ .dylib บน macOS) รูปแบบการตั้งชื่อจะสอดคล้องกับธรรมเนียมของไลบรารีที่ใช้ร่วมกันในระบบ
print(package.cpath)
-- ./?.so;/usr/local/lib/lua/5.4/?.so;...
-- Add a local C library directory
package.cpath = "./clib/?.so;" .. package.cpath
-- require("myextension") will now search:
-- ./clib/myextension.soตัวแปรสภาพแวดล้อม LUA_PATH
ตัวแปรสภาพแวดล้อม LUA_PATH กำหนดค่าเริ่มต้นของ package.path เครื่องหมาย ;; ใน LUA_PATH จะถูกแทนที่ด้วยเส้นทางเริ่มต้น ใช้วิธีนี้เพื่อกำหนดค่าเส้นทางค้นหาโดยไม่ต้องแก้ไขสคริปต์ ซึ่งมีประโยชน์ในการนำไปใช้งานจริง
-- Set before launching Lua:
-- export LUA_PATH="./?.lua;./lib/?.lua;;"
-- The ";;" expands to the built-in default path
-- In Lua, check what was set:
print(package.path)
-- You can also use LUA_CPATH for C paths:
-- export LUA_CPATH="./clib/?.so;;"package.searchpath
package.searchpath(name, path) ค้นหาไฟล์ที่ตรงกับชื่อในสตริงเส้นทาง โดยส่งคืนผลลัพธ์แรกที่พบ หรือส่งคืน nil พร้อมข้อความแสดงข้อผิดพลาดที่ระบุตำแหน่งทั้งหมดที่ลองค้นหา วิธีนี้มีประโยชน์สำหรับค้นหาไฟล์โดยไม่ต้องโหลดไฟล์จริง
local file, err = package.searchpath("json", package.path)
if file then
print("Found:", file)
else
print("Not found. Tried:\n" .. err)
end
-- Useful for checking if a module exists:
local function moduleExists(name)
return package.searchpath(name, package.path) ~= nil
end
print(moduleExists("json"))อัลกอริทึมการค้นหาของ require
เมื่อคุณเรียกใช้ require("mod") Lua จะทำตามลำดับดังนี้: (1) ตรวจสอบ package.loaded (2) ตรวจสอบ package.preload (3) ค้นหาไฟล์ .lua ใน package.path (4) ค้นหาไลบรารี C ใน package.cpath ผลลัพธ์แรกที่พบจะถูกเลือกใช้
-- Simulate what require does:
local function myRequire(name)
-- 1. Check cache
if package.loaded[name] ~= nil then
return package.loaded[name]
end
-- 2. Check preload
if package.preload[name] then
return package.preload[name]()
end
-- 3. Search path
local file = package.searchpath(name, package.path)
if file then
return dofile(file) -- simplified
end
error("module not found: " .. name)
endฟังก์ชันโหลด
package.searchers (เดิมคือ package.loaders) เป็นอาร์เรย์ของฟังก์ชันที่พยายามค้นหาและโหลดโมดูล คุณสามารถเพิ่มตัวค้นหาแบบกำหนดเองลงในตารางนี้ได้ ตัวค้นหาแต่ละตัวจะรับชื่อโมดูลและส่งคืนฟังก์ชันโหลดหรือ nil
-- Add a custom searcher that loads from a table
local builtins = {
myconfig = function()
return {host="localhost", port=8080}
end
}
table.insert(package.searchers, 1, function(name)
local loader = builtins[name]
if loader then return loader end
end)
local cfg = require("myconfig")
print(cfg.host, cfg.port) -- localhost 8080หลักการตั้งชื่อโมดูล
ชื่อโมดูลมีลำดับชั้นโดยใช้จุด เช่น "mylib.utils" โดยทั่วไป เนมสเปซระดับบนสุดจะเป็นชื่อโครงการหรือองค์กรของคุณเพื่อหลีกเลี่ยงความขัดแย้ง ควรใช้ตัวพิมพ์เล็กเป็นมาตรฐาน หลีกเลี่ยงขีดกลางในชื่อโมดูล (ใช้ขีดล่างแทน) เนื่องจากขัดแย้งกับไวยากรณ์ของ Lua
-- Good: hierarchical, lowercase
-- require("myapp.db.connection")
-- require("myapp.utils.string")
-- Bad: dashes cause syntax issues in dot notation
-- local my-module = require("my-module") -- SYNTAX ERROR
local mymodule = require("my_module") -- okการแก้ไขข้อผิดพลาดของเส้นทาง
เมื่อ require ไม่พบโมดูล ข้อความแสดงข้อผิดพลาดจะแสดงเส้นทางทั้งหมดที่ลองค้นหา พิมพ์ package.path เพื่อดูลำดับการค้นหา ใช้ package.searchpath เพื่อตรวจสอบเส้นทางของโมดูลที่ระบุแบบโต้ตอบ
-- Debug require failures:
local ok, err = pcall(require, "missing_module")
if not ok then
-- The error message shows all tried paths
print("require failed:")
print(err)
print("\nCurrent package.path:")
for path in package.path:gmatch("[^;]+") do
print(" " .. path)
end
endการคืนค่าเส้นทางเริ่มต้น
หากต้องการเส้นทางที่สะอาดและมีเพียงรายการขั้นต่ำโดยไม่มีค่าเริ่มต้นของระบบ คุณสามารถรีเซ็ต package.path ทั้งหมดได้ วิธีนี้มีประโยชน์สำหรับสภาพแวดล้อม Lua แบบฝังตัวที่ระบบไฟล์มีข้อจำกัดหรืออยู่ในแซนด์บ็อกซ์
-- Minimal path for embedded environment
package.path = "./?.lua;./lib/?.lua"
package.cpath = "./?.so"
-- Or get just the current directory patterns:
local function justLocal()
return "./?.lua;./?/init.lua"
end
print("Minimal path:", justLocal())ตรวจสอบความเข้าใจอย่างรวดเร็ว
เครื่องหมาย ? ในรูปแบบของ package.path แทนสิ่งใด
สรุป: package.path
สรุป:
package.path: รูปแบบการค้นหาไฟล์ Lua โดย?= ชื่อโมดูลpackage.cpath: รูปแบบการค้นหาไลบรารี C- เติมไว้ด้านหน้าเพื่อเพิ่มไดเรกทอรีที่มีลำดับความสำคัญสูง
- ตัวแปรสภาพแวดล้อม
LUA_PATH/LUA_CPATHใช้กำหนดเส้นทางเริ่มต้น package.searchpath: ตรวจสอบว่าสามารถค้นหาโมดูลได้หรือไม่- เพิ่มตัวค้นหาแบบกำหนดเองผ่าน
package.searchers
คำถามที่พบบ่อย
บทเรียน “package.path และ package.cpath” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “package.path และ package.cpath” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Lua Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Lua Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “package.path และ package.cpath”
กำหนดเส้นทางค้นหาสำหรับมอดูล Lua และ C คุณปฏิบัติ Lua Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Lua Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Lua Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน
บทเรียน “package.path และ package.cpath” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Lua Academy นี้ได้ไหม
ได้ บทเรียน Lua Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- ฟังก์ชัน require
- การเขียนไฟล์มอดูล
- package.path และ package.cpath
- รูปแบบมอดูลและแนวทางปฏิบัติที่ดี