深入Lua包(Package)与依赖管理

一、包的目录结构与require

require 函数天生就能理解目录结构。它通过点(.)来代表目录分隔符。

假设我们有这样一个项目结构:

bash 复制代码
/my_app
├── main.lua
└── /geometry       <-- 这是一个包
    ├── shape.lua
    └── transform.lua

shape.lua:

lua 复制代码
local M = {}
function M.new_circle(radius) return { type = 'circle', r = radius, x = 0, y = 0 } end
return M

transform.lua:

lua 复制代码
local M = {}
function M.move(shape, dx, dy)
    shape.x = shape.x + dx
    shape.y = shape.y + dy
    return shape
end
return M

在 main.lua 中,我们可以轻松地加载这个包里的模块:

lua 复制代码
-- main.lua

-- 加载 geometry 包中的 shape 模块
local Shape = require("geometry.shape")

-- 加载 geometry 包中的 transform 模块
local Transform = require("geometry.transform")

-- 现在可以使用它们的功能
local circle = Shape.new_circle(10)
local moved_circle = Transform.move(circle, 5, 5)

print("圆形位置:", moved_circle.x, moved_circle.y)

二、包的核心入口:init.lua 文件

当我们无法或者不需要理解包内部结构时,就需要 init.lua 来导出外部需要的接口。当 require 一个目录时,Lua 会自动寻找并加载该目录下的 init.lua 文件。

让我们来改造一下上面的 geometry 包:

目录结构:

bash 复制代码
/my_app
├── main.lua
└── /geometry
    ├── shape.lua
    ├── transform.lua
    └── init.lua      <-- 新增的核心入口文件

init.lua (关键部分):

lua 复制代码
-- geometry/init.lua

-- 1. 创建一个代表整个包的表
local geometry = {}

-- 2. 加载包内部的私有模块
local Shape = require("geometry.shape")
local Transform = require("geometry.transform")

-- 3. 将需要暴露给外部的函数,挂载到 geometry 表上
geometry.create_circle = Shape.new_circle
geometry.move_shape = Transform.move

-- 4. 返回这个整合后的表
return geometry

现在,我们的 main.lua 可以变得更加简洁和高内聚:

lua 复制代码
-- main.lua

-- 只需要加载 geometry 这一个包!
local geometry = require("geometry")

-- 通过包提供的主接口来使用功能
local my_shape = geometry.create_circle(10)
geometry.move_shape(my_shape, 5, 5)

print("形状位置:", my_shape.x, my_shape.y)

三、包的搜索路径:package.path

当你调用 require("geometry") 时,Lua 怎么知道去哪里找这个文件呢?它使用 package.path 这个变量,其中包含一系列搜索路径模板。

你可以查看它:

lua 复制代码
print(package.path)

通常会输出类似这样的内容:

s 复制代码
./?.lua;/usr/local/share/lua/5.4/?.lua;/usr/local/share/lua/5.4/?/init.lua

其中的 ? 会被你传给 require 的模块名替换。

如果需要,你也可以修改它来添加自定义搜索路径:

lua 复制代码
package.path = package.path .. ";/my/custom/path/?.lua"

结语

点个赞,关注我获取更多实用 Lua 技术干货!如果觉得有用,记得收藏本文!

相关推荐
郑州光合科技余经理11 小时前
本地生活服务系统:预约状态和进度通知接口怎么拆
java·开发语言·前端·javascript·后端·php·生活
Peter-Code12 小时前
Nginx 常用操作整理(前端)
服务器·前端·nginx
Java后端的Ai之路21 小时前
06-React-Props
前端·react.js·前端框架
Flynt1 天前
开源"间谍卫星"说数据全是真的,我把它的免key数据源挨个试了一遍
前端·开源·数据可视化
Csvn1 天前
渲染管线
前端
程序员大阳1 天前
副队长CSS教程(33)–圆角与透明
前端·css·透明·圆角
志尊宝1 天前
Vue3 零基础每日笔记(082):文件上传实战——el-upload 校验、自定义上传、头像预览
前端·javascript·vue.js·笔记·#javascript·#vue.js
鬼手点金1 天前
opencode-rules 插件
java·开发语言·前端·人工智能·chrome·git·github
柳杉1 天前
借助 Codex 和可视化工作流,从调研到完整实现,3D 大屏竟然可以这么简单
前端·ai编程·数据可视化
IMPYLH1 天前
HTML 的 <wbr> 元素
前端·html