package.path ve package.cpath
Lua ve C modülleri için arama yollarını yapılandırın.
package.path ve package.cpath, CoddyKit'te ücretsiz bir Lua Academy dersidir. Bu, 4 dersinin 3. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Lua Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Lua Academy kursu toplamda 4 dersten oluşur.
package.path İçeriği
package.path, noktalı virgüllerle ayrılmış arama kalıplarından oluşan bir dizedir. Her kalıpta, modül adıyla değiştirilen bir ? yer tutucusu bulunur (nokta işaretleri dizin ayraçlarına dönüştürülür). Lua, bir dosya bulana kadar her kalıbı sırayla dener.
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/barArama Yolları Ekleme
Arama dizinleri eklemek için yolları package.path başına ekleyin. Sona eklemek, daha düşük öncelikli konumlar ekler. Yeni yollara ihtiyaç duyan herhangi bir require çağrısından önce bunu ayarlayın.
-- 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 -> ...C Uzantıları için package.cpath
package.cpath, C uzantı modülleri için arama yoludur (paylaşılan kitaplıklar: Linux'ta .so, Windows'ta .dll, macOS'ta .dylib). Adlandırma kuralı, sistemin paylaşılan kitaplık kurallarıyla eşleşir.
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.soLUA_PATH Ortam Değişkeni
LUA_PATH ortam değişkeni, package.path değerinin başlangıç değerini belirler. LUA_PATH içindeki bir ;;, varsayılan yolla değiştirilir. Betikleri değiştirmeden arama yollarını yapılandırmak için bunu kullanın; dağıtım için kullanışlıdır.
-- 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), yol dizesinde adla eşleşen bir dosyayı arar. Bulduğu ilk eşleşmeyi veya nil değerini ve denenmiş tüm konumları listeleyen bir hata iletisini döndürür. Dosyaları gerçekten yüklemeden bulmak için kullanışlıdır.
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"))require Arama Algoritması
require("mod") çağrıldığında Lua şu sırayı izler: (1) package.loaded denetlenir, (2) package.preload denetlenir, (3) package.path içinde bir .lua dosyası aranır, (4) package.cpath içinde bir C kitaplığı aranır. İlk eşleşme kazanır.
-- 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)
endYükleyici İşlevler
package.searchers (eski adıyla package.loaders), bir modülü bulup yüklemeyi deneyen işlevlerden oluşan bir dizidir. Bu tabloya özel arayıcılar ekleyebilirsiniz. Her arayıcı bir modül adı alır ve bir yükleyici işlevi veya nil döndürür.
-- 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 8080Modül Adlandırma Kuralları
Modül adları nokta kullanılarak hiyerarşik biçimde yazılır: "mylib.utils". Çakışmaları önlemek için geleneksel üst düzey ad alanı, projenizin veya kuruluşunuzun adıdır. Küçük harf kullanımı standarttır. Modül adlarında kısa çizgi kullanmaktan kaçının; Lua söz dizimiyle çakıştıkları için bunun yerine alt çizgi kullanın.
-- 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") -- okYol Hatalarını Ayıklama
require bir modülü bulamadığında, hata iletisi denenen tüm yolları listeler. Arama sırasını görmek için package.path değerini yazdırın. Belirli modül yollarını etkileşimli olarak denetlemek için package.searchpath kullanın.
-- 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
endVarsayılan Yola Sıfırlama
Sistem varsayılanları olmadan temiz ve en küçük yolu istiyorsanız package.path değerini tamamen sıfırlayabilirsiniz. Bu, dosya sisteminin kısıtlı veya korumalı alanla sınırlandırılmış olduğu gömülü Lua ortamları için kullanışlıdır.
-- 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())Hızlı Kontrol
Bir package.path kalıbındaki ? neyi temsil eder?
Özet: package.path
Özet:
package.path: Lua dosyası arama kalıpları;?= modül adıpackage.cpath: C kitaplığı arama kalıpları- Yüksek öncelikli dizinler eklemek için başına ekleyin
LUA_PATH/LUA_CPATHortam değişkenleri başlangıç yollarını belirlerpackage.searchpath: bir modülün bulunup bulunamayacağını denetlerpackage.searchersaracılığıyla özel arayıcılar ekleyin
Sıkça Sorulan Sorular
“package.path ve package.cpath” dersi ücretsiz mi?
Evet — “package.path ve package.cpath” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Lua Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Lua Academy kursu toplamda 4 dersten oluşur.
“package.path ve package.cpath” dersinde ne öğreneceğim?
Lua ve C modülleri için arama yollarını yapılandırın. Lua Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
Lua Academy öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te Lua Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 3. dersidir.
“package.path ve package.cpath” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu Lua Academy dersinde kod yazıp çalıştırabilir miyim?
Evet. Her Lua Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- require İşlevi
- Bir Modül Dosyası Yazma
- package.path ve package.cpath
- Modül Örüntüleri ve En İyi Uygulamalar