0Pricing
Lua Academy · Pelajaran

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

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

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

Fungsi 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  8080

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

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

Mengatur 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 modul
  • package.cpath: pola pencarian pustaka C
  • Tambahkan di awal untuk menambahkan direktori berprioritas tinggi
  • Variabel lingkungan LUA_PATH/LUA_CPATH menetapkan 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

  1. Fungsi require
  2. Menulis Berkas Modul
  3. package.path dan package.cpath
  4. Pola Modul dan Praktik Terbaik
← Kembali ke Lua Academy