0Pricing
Lua Academy · Lekcja

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

Dodawanie ś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.so

Zmienna ś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)
end

Funkcje ł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  8080

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

Debugowanie ś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
end

Przywracanie 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łu
  • package.cpath: wzorce wyszukiwania bibliotek C
  • Dodaj ścieżkę na początku, aby nadać katalogom wyższy priorytet
  • Zmienne środowiskowe LUA_PATH/LUA_CPATH ustawiają 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

  1. Funkcja require
  2. Tworzenie pliku modułu
  3. package.path i package.cpath
  4. Wzorce modułów i dobre praktyki
← Powrót do Lua Academy