package.path i package.cpath
Proszę konfigurować ścieżki wyszukiwania modułów Lua i C.
package.path i package.cpath to bezpłatna lekcja Lua Academy na CoddyKit. To lekcja 3 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Lua Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Lua Academy zawiera 4 lekcji w sumie.
Zawartość package.path
package.path to ciąg wzorców wyszukiwania oddzielonych średnikami. Każdy wzorzec zawiera symbol zastępczy ?, który jest zastępowany nazwą modułu (kropki są zamieniane na separatory katalogów). Lua sprawdza wzorce po kolei, aż znajdzie plik.
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/barDodawanie ścieżek wyszukiwania
Dodaj ścieżki na początku package.path, aby dodać katalogi wyszukiwania. Dopisanie ścieżek na końcu dodaje lokalizacje o niższym priorytecie. Zrób to przed wywołaniami require, które mają korzystać z nowych ścieżek.
-- 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 dla rozszerzeń C
package.cpath to ścieżka wyszukiwania modułów będących rozszerzeniami C (biblioteki współdzielone: .so w systemie Linux, .dll w systemie Windows i .dylib w systemie macOS). Konwencja nazewnictwa odpowiada konwencjom systemowych bibliotek współdzielonych.
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.soZmienna środowiskowa LUA_PATH
Zmienna środowiskowa LUA_PATH ustawia początkową wartość package.path. Sekwencja ;; w LUA_PATH jest zastępowana domyślną ścieżką. Użyj jej, aby skonfigurować ścieżki wyszukiwania bez modyfikowania skryptów — jest to przydatne podczas wdrażania.
-- 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) wyszukuje w ciągu ścieżek plik pasujący do nazwy. Zwraca pierwsze znalezione dopasowanie albo nil i komunikat o błędzie zawierający listę wszystkich sprawdzonych lokalizacji. Jest to przydatne do wyszukiwania plików bez ich faktycznego ładowania.
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"))Algorytm wyszukiwania require
Po wywołaniu require("mod") Lua postępuje w następującej kolejności: (1) sprawdza package.loaded, (2) sprawdza package.preload, (3) przeszukuje package.path w poszukiwaniu pliku .lua, (4) przeszukuje package.cpath w poszukiwaniu biblioteki C. Wygrywa pierwsze znalezione dopasowanie.
-- 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)
endFunkcje ładujące
package.searchers (wcześniej package.loaders) to tablica funkcji, które próbują znaleźć i załadować moduł. Do tej tabeli można dodawać własne funkcje wyszukujące. Każda z nich otrzymuje nazwę modułu i zwraca funkcję ładującą albo 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 8080Konwencje nazewnictwa modułów
Nazwy modułów mają strukturę hierarchiczną i używają kropek: "mylib.utils". Zgodnie z konwencją przestrzenią nazw najwyższego poziomu jest nazwa projektu lub organizacji, co pozwala uniknąć konfliktów. Standardem są małe litery. Unikaj myślników w nazwach modułów (używaj zamiast nich podkreśleń), ponieważ kolidują ze składnią 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") -- okDebugowanie ścieżek
Gdy require nie znajdzie modułu, komunikat o błędzie zawiera wszystkie sprawdzone ścieżki. Wyświetl package.path, aby zobaczyć kolejność wyszukiwania. Użyj package.searchpath, aby interaktywnie sprawdzić ścieżki konkretnego modułu.
-- 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
endPrzywracanie domyślnej ścieżki
Jeśli potrzebujesz czystej, minimalnej ścieżki bez domyślnych ścieżek systemowych, możesz całkowicie zresetować package.path. Jest to przydatne w osadzonych środowiskach Lua, w których system plików jest ograniczony lub działa w piaskownicy.
-- 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())Szybkie sprawdzenie
Co oznacza symbol ? we wzorcu package.path?
Podsumowanie: package.path
Podsumowanie:
package.path: wzorce wyszukiwania plików Lua;?= nazwa modułupackage.cpath: wzorce wyszukiwania bibliotek C- Dodaj ścieżkę na początku, aby nadać katalogom wyższy priorytet
- Zmienne środowiskowe
LUA_PATH/LUA_CPATHustawiają początkowe ścieżki package.searchpath: sprawdza, czy można znaleźć moduł- Dodawaj własne funkcje wyszukujące za pomocą
package.searchers
Często zadawane pytania
Czy lekcja „package.path i package.cpath” jest bezpłatna?
Tak — pełny tekst „package.path i package.cpath” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Lua Academy, przejdź na CoddyKit PRO. Kurs Lua Academy zawiera 4 lekcji w sumie.
Co nauczysz się w „package.path i package.cpath”?
Proszę konfigurować ścieżki wyszukiwania modułów Lua i C. Ćwiczysz Lua Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć Lua Academy?
Nie wymagamy żadnego doświadczenia. Lua Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 3 z 4.
Ile czasu zajmuje lekcja „package.path i package.cpath”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji Lua Academy?
Tak. Każda lekcja Lua Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- Funkcja require
- Tworzenie pliku modułu
- package.path i package.cpath
- Wzorce modułów i dobre praktyki