Lua Academy · Pelajaran

package.path dan package.cpath

Konfigurasikan laluan carian untuk modul Lua dan C.

Pelajaran 3 daripada 412 langkah

package.path dan package.cpath ialah pelajaran Lua Academy percuma di CoddyKit. Ini ialah pelajaran 3 daripada 4. Sebanyak 3 pelajaran dalam laluan pembelajaran ini boleh dibaca sepenuhnya secara percuma — selepas itu, CoddyKit PRO membuka akses kepada semua pelajaran, serta latihan praktikal dengan penyunting kod terbina dalam dan tutor kecerdasan buatan yang tersedia 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran Lua Academy, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus Lua Academy merangkumi sejumlah 4 pelajaran.

Kandungan package.path

package.path ialah rentetan corak carian yang dipisahkan oleh koma bertitik. Setiap corak mempunyai ruang letak ? yang digantikan dengan nama modul (dengan titik ditukar kepada pemisah direktori). Lua mencuba setiap corak mengikut turutan sehingga fail ditemui.

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

Menambah Laluan Carian

Letakkan laluan di hadapan package.path untuk menambah direktori carian. Menambahkannya di belakang akan menghasilkan lokasi berkeutamaan lebih rendah. Tetapkan nilai ini sebelum sebarang panggilan require yang memerlukan laluan baharu.

-- 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 Sambungan C

package.cpath ialah laluan carian untuk modul sambungan C (pustaka dikongsi: .so pada Linux, .dll pada Windows, .dylib pada macOS). Konvensyen penamaan ini sepadan dengan konvensyen pustaka dikongsi 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

Pemboleh Ubah Persekitaran LUA_PATH

Pemboleh ubah persekitaran LUA_PATH menetapkan nilai awal package.path. ;; dalam LUA_PATH digantikan dengan laluan lalai. Gunakan ini untuk mengkonfigurasi laluan carian tanpa mengubah suai skrip — berguna untuk penggunaan.

-- 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 fail yang sepadan dengan nama dalam rentetan laluan. Ia mengembalikan padanan pertama yang ditemui, atau nil dan mesej ralat yang menyenaraikan semua lokasi yang telah dicuba. Berguna untuk mencari fail tanpa benar-benar memuatkannya.

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

Algoritma Carian require

Apabila Anda memanggil require("mod"), Lua mengikut urutan ini: (1) semak package.loaded, (2) semak package.preload, (3) cari fail .lua dalam package.path, (4) cari pustaka C dalam package.cpath. Padanan pertama 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 (dahulunya package.loaders) ialah tatasusunan fungsi yang cuba mencari dan memuatkan modul. Anda boleh menambah pencari tersuai pada jadual 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

Konvensyen Nama Modul

Nama modul bersifat hierarki dan menggunakan titik: "mylib.utils". Ruang nama peringkat teratas yang lazim ialah nama projek atau organisasi Anda bagi mengelakkan konflik. Huruf kecil ialah amalan standard. Elakkan tanda sempang dalam nama modul (gunakan garis bawah) kerana tanda sempang bercanggah 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

Penyahpepijatan Laluan

Apabila require gagal mencari modul, mesej ralat menyenaraikan semua laluan yang telah dicuba. Cetak package.path untuk melihat susunan carian. Gunakan package.searchpath untuk menyemak laluan 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

Menetapkan Semula kepada Laluan Lalai

Jika Anda mahukan laluan yang bersih dan minimum tanpa lalai sistem, Anda boleh menetapkan semula package.path sepenuhnya. Ini berguna untuk persekitaran Lua terbenam apabila sistem fail adalah terhad atau dikotak pasirkan.

-- 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())

Semakan Pantas

Apakah yang diwakili oleh ? dalam corak package.path?

Imbas Kembali: package.path

Ringkasan:

  • package.path: corak carian fail Lua; ? = nama modul
  • package.cpath: corak carian pustaka C
  • Letakkan di hadapan untuk menambah direktori berkeutamaan tinggi
  • Pemboleh ubah persekitaran LUA_PATH/LUA_CPATH menetapkan laluan awal
  • package.searchpath: semak sama ada modul boleh ditemui
  • Tambah pencari tersuai melalui package.searchers
Percuma untuk bermula

Pelajari Lua dengan tutor kecerdasan buatan — percuma

Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.

Kursus
40
Pelajaran
159

Soalan Lazim

Adakah pelajaran “package.path dan package.cpath” percuma?

Ya — sebanyak 3 pelajaran dalam laluan pembelajaran Lua Academy, termasuk “package.path dan package.cpath”, boleh dibaca sepenuhnya secara percuma di web ini. Selepas itu, CoddyKit PRO membuka akses kepada semua pelajaran, serta latihan interaktif dengan penyunting kod terbina dalam dan tutor kecerdasan buatan yang tersedia 24/7. Kursus Lua Academy merangkumi sejumlah 4 pelajaran.

Apakah yang akan saya pelajari dalam “package.path dan package.cpath”?

Konfigurasikan laluan carian untuk modul Lua dan C. Anda berlatih Lua Academy menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.

Adakah saya memerlukan pengalaman untuk memulakan Lua Academy?

Tiada pengalaman terdahulu diperlukan. Pembelajaran Lua Academy di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 3 daripada 4.

Berapa lamakah pelajaran “package.path dan package.cpath” diambil?

Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.

Bolehkah saya menulis dan menjalankan kod dalam pelajaran Lua Academy ini?

Ya. Setiap pelajaran Lua Academy menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.

Semua pelajaran dalam kursus ini

  1. Fungsi require
  2. Menulis Fail Modul
  3. package.path dan package.cpath
  4. Corak Modul dan Amalan Terbaik
← Kembali ke Lua Academy