package.path og package.cpath
Konfigurér søgestier til Lua- og C-moduler.
package.path og package.cpath er en gratis Lua Academy-lektion på CoddyKit. Dette er lektion 3 af 4. Du kan læse alle 3 lektioner i dette læringsspor gratis i deres fulde længde — derefter låser CoddyKit PRO alle lektioner op samt praktiske øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. Den er en del af læringsforløbet i Lua Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. Lua Academy-kurset indeholder 4 lektioner i alt.
Indholdet i package.path
package.path er en streng med søgemønstre adskilt af semikoloner. Hvert mønster har en ?-pladsholder, som erstattes af modulnavnet (med punktummer omsat til mappeseparatorer). Lua prøver hvert mønster i rækkefølge, indtil en fil findes.
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/barTilføjelse af søgestier
Sæt stier foran i package.path for at tilføje søgemapper. Hvis du sætter dem bagpå, tilføjes placeringer med lavere prioritet. Indstil dette før alle require-kald, der skal bruge de nye stier.
-- 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 til C-udvidelser
package.cpath er søgestien til C-udvidelsesmoduler (delte biblioteker: .so på Linux, .dll på Windows, .dylib på macOS). Navngivningskonventionen følger konventionerne for delte systembiblioteker.
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.soMiljøvariablen LUA_PATH
Miljøvariablen LUA_PATH angiver startværdien for package.path. En ;; i LUA_PATH erstattes af standardstien. Brug dette til at konfigurere søgestier uden at ændre scripts – nyttigt ved udrulning.
-- 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) søger efter en fil, der matcher navnet, i stistrengen. Den returnerer det første fundne match eller nil og en fejlmeddelelse med alle de placeringer, der blev forsøgt. Det er nyttigt til at finde filer uden faktisk at indlæse dem.
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"))Søgealgoritmen for require
Når du kalder require("mod"), følger Lua denne rækkefølge: (1) tjek package.loaded, (2) tjek package.preload, (3) søg efter en .lua-fil i package.path, (4) søg efter et C-bibliotek i package.cpath. Det første match vinder.
-- 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)
endIndlæsningsfunktioner
package.searchers (tidligere package.loaders) er en række funktioner, der forsøger at finde og indlæse et modul. Du kan føje brugerdefinerede søgere til denne tabel. Hver søger modtager et modulnavn og returnerer en indlæsningsfunktion eller 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 8080Konventioner for modulnavne
Modulnavne er hierarkiske og bruger punktummer: "mylib.utils". Det konventionelle navnerum på øverste niveau er dit projekt- eller organisationsnavn for at undgå konflikter. Små bogstaver er standard. Undgå bindestreger i modulnavne (brug i stedet understregninger), da de er i konflikt med Lua-syntaksen.
-- 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") -- okFejlfinding af stier
Når require ikke kan finde et modul, viser fejlmeddelelsen alle de stier, der blev forsøgt. Udskriv package.path for at se søgerækkefølgen. Brug package.searchpath til interaktivt at kontrollere bestemte modulstier.
-- 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
endNulstilling til standardstien
Hvis du vil have en ren, minimal sti uden systemstandarder, kan du nulstille package.path helt. Det er nyttigt i indlejrede Lua-miljøer, hvor filsystemet er begrænset eller isoleret.
-- 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())Hurtigt tjek
Hvad repræsenterer ? i et package.path-mønster?
Opsummering: package.path
Opsummering:
package.path: søgemønstre for Lua-filer;?= modulnavnpackage.cpath: søgemønstre for C-biblioteker- Sæt stier foran for at tilføje mapper med høj prioritet
- Miljøvariablerne
LUA_PATH/LUA_CPATHangiver startstierne package.searchpath: kontrollér, om et modul kan findes- Tilføj brugerdefinerede søgere via
package.searchers
Lær Lua med en AI-underviser — gratis
Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.
- Kurser
- 40
- Lektioner
- 159
Ofte stillede spørgsmål
Er lektionen “package.path og package.cpath” gratis?
Ja — alle 3 lektioner i læringssporet Lua Academy, inklusive “package.path og package.cpath”, kan læses gratis i deres fulde længde her på webstedet. Derefter låser CoddyKit PRO alle lektioner op samt interaktive øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. Lua Academy-kurset indeholder 4 lektioner i alt.
Hvad lærer jeg i “package.path og package.cpath”?
Konfigurér søgestier til Lua- og C-moduler. Du øver dig i Lua Academy med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.
Skal jeg have erfaring for at begynde på Lua Academy?
Der kræves ingen tidligere erfaring. Lua Academy på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 3 af 4.
Hvor lang tid tager lektionen “package.path og package.cpath”?
De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.
Kan jeg skrive og køre kode i denne Lua Academy-lektion?
Ja. Alle Lua Academy-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.
Alle lektioner i dette kursus
- Funktionen require
- Skrivning af en modulfil
- package.path og package.cpath
- Modulmønstre og bedste praksis