0Pricing
Lua Academy · Lektion

package.path und package.cpath

Konfigurieren Sie Suchpfade für Lua- und C-Module

package.path und package.cpath ist eine kostenlose Lua Academy-Lektion auf CoddyKit. Dies ist Lektion 3 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des Lua Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der Lua Academy-Kurs umfasst insgesamt 4 Lektionen.

Inhalt von package.path

package.path ist eine Zeichenkette aus durch Semikolons getrennten Suchmustern. Jedes Muster enthält den Platzhalter ?, der durch den Modulnamen ersetzt wird (wobei Punkte in Verzeichnistrennzeichen umgewandelt werden). Lua probiert die Muster der Reihe nach aus, bis eine Datei gefunden wird.

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

Suchpfade hinzufügen

Stellen Sie Pfade package.path voran, um Suchverzeichnisse hinzuzufügen. Anhängen fügt Verzeichnisse mit niedrigerer Priorität hinzu. Setzen Sie dies vor allen require-Aufrufen, die die neuen Pfade benötigen.

-- 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 für C-Erweiterungen

package.cpath ist der Suchpfad für C-Erweiterungsmodule (gemeinsam genutzte Bibliotheken: .so unter Linux, .dll unter Windows, .dylib unter macOS). Die Namenskonvention entspricht den Konventionen des jeweiligen Betriebssystems für gemeinsam genutzte Bibliotheken.

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

Umgebungsvariable LUA_PATH

Die Umgebungsvariable LUA_PATH legt den Anfangswert von package.path fest. Ein ;; in LUA_PATH wird durch den Standardpfad ersetzt. Verwenden Sie dies, um Suchpfade zu konfigurieren, ohne Skripte zu ändern – besonders nützlich für die Bereitstellung.

-- 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) sucht im Pfadstring nach einer Datei, die dem Namen entspricht. Die Funktion gibt den ersten gefundenen Treffer zurück oder nil und eine Fehlermeldung, die alle geprüften Speicherorte auflistet. Das ist nützlich, um Dateien zu finden, ohne sie tatsächlich zu laden.

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

Suchalgorithmus von require

Wenn Sie require("mod") aufrufen, geht Lua in dieser Reihenfolge vor: (1) package.loaded prüfen, (2) package.preload prüfen, (3) in package.path nach einer .lua-Datei suchen, (4) in package.cpath nach einer C-Bibliothek suchen. Der erste Treffer wird verwendet.

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

Loader-Funktionen

package.searchers (früher package.loaders) ist ein Array von Funktionen, die versuchen, ein Modul zu finden und zu laden. Sie können dieser Tabelle eigene Suchfunktionen hinzufügen. Jede Suchfunktion erhält einen Modulnamen und gibt eine Loader-Funktion oder nil zurück.

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

Konventionen für Modulnamen

Modulnamen sind hierarchisch aufgebaut und verwenden Punkte: "mylib.utils". Als oberste Namespace-Ebene wird üblicherweise der Name Ihres Projekts oder Ihrer Organisation verwendet, um Konflikte zu vermeiden. Kleinschreibung ist Standard. Vermeiden Sie Bindestriche in Modulnamen (verwenden Sie stattdessen Unterstriche), da sie mit der Lua-Syntax kollidieren.

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

Pfade debuggen

Wenn require ein Modul nicht finden kann, listet die Fehlermeldung alle geprüften Pfade auf. Geben Sie package.path aus, um die Reihenfolge der Suche zu sehen. Verwenden Sie package.searchpath, um bestimmte Modulpfade interaktiv zu prüfen.

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

Auf Standardpfad zurücksetzen

Wenn Sie einen sauberen, minimalen Pfad ohne Systemstandards benötigen, können Sie package.path vollständig zurücksetzen. Das ist nützlich in eingebetteten Lua-Umgebungen, in denen das Dateisystem eingeschränkt oder in einer Sandbox isoliert ist.

-- 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())

Kurzer Check

Wofür steht das ? in einem package.path-Muster?

Zusammenfassung: package.path

Zusammenfassung:

  • package.path: Suchmuster für Lua-Dateien; ? = Modulname
  • package.cpath: Suchmuster für C-Bibliotheken
  • Voranstellen fügt Verzeichnisse mit hoher Priorität hinzu
  • Die Umgebungsvariablen LUA_PATH/LUA_CPATH legen die Anfangspfade fest
  • package.searchpath: prüft, ob ein Modul gefunden werden kann
  • Eigene Suchfunktionen über package.searchers hinzufügen

Häufig gestellte Fragen

Ist die Lektion „package.path und package.cpath“ kostenlos?

Ja — der vollständige Text von „package.path und package.cpath“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des Lua Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der Lua Academy-Kurs umfasst insgesamt 4 Lektionen.

Was lerne ich in „package.path und package.cpath“?

Konfigurieren Sie Suchpfade für Lua- und C-Module Du übst Lua Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.

Brauche ich Erfahrung, um Lua Academy zu starten?

Keine Vorkenntnisse erforderlich. Lua Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 3 von 4.

Wie lange dauert die Lektion „package.path und package.cpath“?

Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.

Kann ich in dieser Lua Academy-Lektion Code schreiben und ausführen?

Ja. Jede Lua Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.

Alle Lektionen in diesem Kurs

  1. Die Funktion require
  2. Eine Moduldatei schreiben
  3. package.path und package.cpath
  4. Modulmuster und bewährte Verfahren
← Zurück zu Lua Academy