0Pricing
Lua Academy · Ders

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

Arama 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.so

LUA_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)
end

Yü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  8080

Modü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")  -- ok

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

Varsayı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_CPATH ortam değişkenleri başlangıç yollarını belirler
  • package.searchpath: bir modülün bulunup bulunamayacağını denetler
  • package.searchers aracı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

  1. require İşlevi
  2. Bir Modül Dosyası Yazma
  3. package.path ve package.cpath
  4. Modül Örüntüleri ve En İyi Uygulamalar
← Lua Academy Sayfasına Dön