Lua Academy · Lektion

package.path og package.cpath

Konfigurér søgestier til Lua- og C-moduler.

Lektion 3 af 412 trin

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/bar

Tilfø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.so

Miljø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)
end

Indlæ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  8080

Konventioner 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")  -- ok

Fejlfinding 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
end

Nulstilling 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; ? = modulnavn
  • package.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_CPATH angiver startstierne
  • package.searchpath: kontrollér, om et modul kan findes
  • Tilføj brugerdefinerede søgere via package.searchers
Gratis at komme i gang

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

  1. Funktionen require
  2. Skrivning af en modulf​​il
  3. package.path og package.cpath
  4. Modulmønstre og bedste praksis
← Tilbage til Lua Academy