0Pricing
Lua Academy · บทเรียน

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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. ฟังก์ชัน require
  2. การเขียนไฟล์มอดูล
  3. package.path และ package.cpath
  4. รูปแบบมอดูลและแนวทางปฏิบัติที่ดี
← กลับไปที่ Lua Academy