Module 如何组织Lua模块路径并写入;要求;在不失去灵活性的情况下打电话?
假设我有一个项目,其文件夹结构如下所示:Module 如何组织Lua模块路径并写入;要求;在不失去灵活性的情况下打电话?,module,lua,Module,Lua,假设我有一个项目,其文件夹结构如下所示: | main.lua | |---<model> // this is a folder | |a.lua | |b.lua | |---<view> |a.lua |b.lua | main.lua | |---//这是一个文件夹 || a.lua || b.lua | |--- |a、 卢阿 |b、 卢阿 型号/a.lua要求型号/b.lua:要求“b” 查看/a.lua要求查看/b.lua
| main.lua
|
|---<model> // this is a folder
| |a.lua
| |b.lua
|
|---<view>
|a.lua
|b.lua
| main.lua
|
|---//这是一个文件夹
|| a.lua
|| b.lua
|
|---
|a、 卢阿
|b、 卢阿
型号/a.lua要求型号/b.lua:要求“b”
查看/a.lua要求查看/b.lua:要求“b”
main.lua需要模型和视图中的文件
现在我无法正确加载这些模块。我知道我可以通过将require调用更改为: 型号/a.lua:
要求“型号b”
查看/a.lua:需要“view.b”
但如果我这样做,每次更改文件夹结构时都必须修改这些文件
所以我的问题是:
因为Lua尽力只依赖ANSI C,这是非常成功的。在ANSI C中,没有这样的目录概念。有几种方法可以使用 您可以将相对路径添加到
package.path
,如中所示。在本例中,您希望在main.lua
中添加路径,这些路径对应于您访问文件的各种方式。这会将更改目录结构时所需的所有更改保留为本地文件
您可以使用debug.getinfo
将绝对路径添加到package.path
——这可能会更容易一些,因为您不需要考虑所有的相对访问,但在更改目录结构时,您仍然需要在main.lua
中执行此操作,您需要对debug.getinfo返回的值执行字符串操作,以去除模块名并添加子目录名
> lunit = require "lunit"
> info = debug.getinfo(lunit.run, "S")
> =info.source
@/usr/local/share/lua/5.2/lunit.lua
> =info.short_src
/usr/local/share/lua/5.2/lunit.lua
当您
require
模块时,require
中的字符串参数被传递到模块中,您可以使用变量参数语法…
访问该模块。您可以使用此选项来包括与当前模块位于同一路径中的其他相关模块,而不必使其依赖于固定的硬编码模块名称
例如,不要执行以下操作:
-- model/a.lua
require "model.b"
及
你可以做:
-- model/a.lua
local thispath = select('1', ...):match(".+%.") or ""
require(thispath.."b")
及
现在,如果您更改目录结构,例如将view
移动到类似control/subcrol/foobar
,那么control/subcrol/foobar/a.lua
(以前的view/a.lua
)现在将尝试要求control/subcrol/foobar/b.lua
,并“做正确的事情”
当然,
main.lua
仍然需要完全限定路径,因为您需要某种方法来消除model/a.lua
和view/a.lua之间的歧义。解决方案是将main.lua
文件夹(项目根)添加到main.lua
中的package.path
支持1级深度文件夹的简单方法:
-- main.lua
package.path = package.path .. ";../?.lua"
注意:require
s在(项目根目录)中将查找项目根目录以外的文件,这是不可取的
使用某些库(例如:,)解析绝对路径并添加它的更好方法:
-- main.lua
local projectRoot = lib.abspath(".")
package.path = package.path .. ";" .. projectRoot .. "/?.lua"
然后在源代码中,使用文件夹名称来确定文件的范围:
-- model/a.lua
require "model.b"
-- you can even do this
require "view.b"
及
谢谢你的编辑和回答。但是项目总是从小到大,它们总是需要重构。在早期阶段制定计划确实很困难。至于除了ANSI C之外没有外部依赖,我同意这是一个很大的优势。但这与更具可移植性的模块搜索规则并不冲突。
-- main.lua
local projectRoot = lib.abspath(".")
package.path = package.path .. ";" .. projectRoot .. "/?.lua"
-- model/a.lua
require "model.b"
-- you can even do this
require "view.b"
-- view/a.lua
require "view.b"