package.path dan package.cpath
Konfigurasikan jalur pencarian untuk modul Lua dan C.
package.path dan package.cpath adalah pelajaran Lua Academy gratis di CoddyKit. Ini adalah pelajaran 3 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Lua Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Lua Academy mencakup 4 pelajaran total.
Isi package.path
package.path adalah string pola pencarian yang dipisahkan oleh titik koma. Setiap pola memiliki penampung ? yang digantikan oleh nama modul (dengan titik diubah menjadi pemisah direktori). Lua mencoba setiap pola secara berurutan sampai menemukan berkas.
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/barMenambahkan Jalur Pencarian
Tambahkan jalur di awal package.path untuk menambahkan direktori pencarian. Menambahkannya di akhir akan menempatkan lokasi tersebut pada prioritas yang lebih rendah. Tetapkan ini sebelum pemanggilan require apa pun yang memerlukan jalur baru.
-- 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 untuk Ekstensi C
package.cpath adalah jalur pencarian untuk modul ekstensi C (pustaka bersama: .so di Linux, .dll di Windows, .dylib di macOS). Konvensi penamaannya mengikuti konvensi pustaka bersama sistem.
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.soVariabel Lingkungan LUA_PATH
Variabel lingkungan LUA_PATH menetapkan nilai awal package.path. ;; dalam LUA_PATH digantikan oleh jalur bawaan. Gunakan ini untuk mengonfigurasi jalur pencarian tanpa mengubah skrip—berguna untuk penerapan.
-- 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) mencari berkas yang cocok dengan nama dalam string jalur. Fungsi ini mengembalikan kecocokan pertama yang ditemukan, atau nil dan pesan kesalahan yang mencantumkan semua lokasi yang telah dicoba. Berguna untuk menemukan berkas tanpa benar-benar memuatnya.
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"))Algoritme Pencarian require
Saat Anda memanggil require("mod"), Lua mengikuti urutan ini: (1) memeriksa package.loaded, (2) memeriksa package.preload, (3) mencari berkas .lua di package.path, (4) mencari pustaka C di package.cpath. Kecocokan pertama yang ditemukan akan digunakan.
-- 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)
endFungsi Pemuat
package.searchers (sebelumnya package.loaders) adalah larik fungsi yang mencoba menemukan dan memuat modul. Anda dapat menambahkan pencari khusus ke tabel ini. Setiap pencari menerima nama modul dan mengembalikan fungsi pemuat atau 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 8080Konvensi Nama Modul
Nama modul bersifat hierarkis dan menggunakan titik: "mylib.utils". Ruang nama tingkat teratas yang lazim adalah nama proyek atau organisasi Anda untuk menghindari konflik. Huruf kecil merupakan standar. Hindari tanda hubung dalam nama modul (gunakan garis bawah sebagai gantinya) karena tanda hubung bertentangan dengan sintaks 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") -- okMenelusuri Kesalahan Jalur
Saat require gagal menemukan modul, pesan kesalahan mencantumkan semua jalur yang telah dicoba. Cetak package.path untuk melihat urutan pencarian. Gunakan package.searchpath untuk memeriksa jalur modul tertentu secara interaktif.
-- 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
endMengatur Ulang ke Jalur Bawaan
Jika Anda menginginkan jalur yang bersih dan minimal tanpa bawaan sistem, Anda dapat mengatur ulang package.path sepenuhnya. Ini berguna untuk lingkungan Lua tertanam yang sistem berkasnya terbatas atau berada dalam kotak pasir.
-- 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())Pemeriksaan Cepat
Apa yang diwakili oleh ? dalam pola package.path?
Rangkuman: package.path
Ringkasan:
package.path: pola pencarian berkas Lua;?= nama modulpackage.cpath: pola pencarian pustaka C- Tambahkan di awal untuk menambahkan direktori berprioritas tinggi
- Variabel lingkungan
LUA_PATH/LUA_CPATHmenetapkan jalur awal package.searchpath: memeriksa apakah modul dapat ditemukan- Tambahkan pencari khusus melalui
package.searchers
Pertanyaan yang Sering Diajukan
Apakah pelajaran “package.path dan package.cpath” gratis?
Ya — teks lengkap “package.path dan package.cpath” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Lua Academy, upgrade ke CoddyKit PRO. Kursus Lua Academy mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “package.path dan package.cpath”?
Konfigurasikan jalur pencarian untuk modul Lua dan C. Kamu berlatih Lua Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai Lua Academy?
Tidak diperlukan pengalaman sebelumnya. Lua Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 3 dari 4.
Berapa lama pelajaran “package.path dan package.cpath” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran Lua Academy ini?
Ya. Setiap pelajaran Lua Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- Fungsi require
- Menulis Berkas Modul
- package.path dan package.cpath
- Pola Modul dan Praktik Terbaik