Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/29.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Module 如何组织Lua模块路径并写入;要求;在不失去灵活性的情况下打电话?_Module_Lua - Fatal编程技术网

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不使用Node.js的模块搜索规则,这看起来更简单
  • 如何解决模块文件中没有硬代码路径的模块路径问题

    我没有更好的跨平台解决方案,也许您应该尽早规划文件夹结构

    为什么Lua不使用Node.js的模块搜索规则,这看起来更简单


    因为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"