如何组织Lua模块路径并编写"require"调用而不失灵活性?

Che*_*hen 8 lua module

假设我有一个项目,其文件夹结构如下所示:

| main.lua
|
|---<model> // this is a folder
|    |a.lua
|    |b.lua
|
|---<view>
     |a.lua
     |b.lua
Run Code Online (Sandbox Code Playgroud)

模型/ a.lua requries 型号/ b.lua:require "b"

视图/ a.lua requries 视图/ b.lua:require "b"

main.lua需要模型视图中的文件.


现在我有问题让这些模块正确加载.我知道我可以通过将require调用更改为:

model/a.lua:require "model.b"

view/a.lua:require "view.b"

但是,如果我这样做,每次更改文件夹结构时都必须修改这些文件.

所以我的问题是:

  1. 如何在模块文件中没有硬代码路径的情况下修复模块路径问题?
  2. 为什么Lua不使用Node.js的模块搜索规则,这看起来更容易?

gre*_*olf 7

当您require使用模块时,字符串参数from require会传递到您可以使用variable-argument语法访问的模块中....您可以使用它来包含其他相关模块,这些模块与正在编辑的当前模块位于同一路径中,require而不依赖于固定的硬编码模块名称.

对于您的示例,而不是:

-- model/a.lua
require "model.b"
Run Code Online (Sandbox Code Playgroud)

-- view/a.lua
require "view.b"
Run Code Online (Sandbox Code Playgroud)

你可以做:

-- model/a.lua
local thispath = select('1', ...):match(".+%.") or ""
require(thispath.."b")
Run Code Online (Sandbox Code Playgroud)

-- view/a.lua
local thispath = select('1', ...):match(".+%.") or ""
require(thispath.."b")
Run Code Online (Sandbox Code Playgroud)

现在,如果您更改目录结构,例如.移动view到类似的东西control/subcontrol/foobar,然后control/subcontrol/foobar/a.lua(以前view/a.lua)将试图要求control/subcontrol/foobar/b.lua而不是" 做正确的事情 ".

当然,main.lua仍然需要完全限定路径,因为你需要一些方法来消除model/a.lua和之间的歧义view/a.lua.