lua require 加载方式与我们现在熟知的路径系统不太一样,想要知道lua require 方法的工作原理也很简单 随便写一个错误的require 代码即可:

1 require("lala");
 这样运行会得到一个报错:
 
 1 1>F:\Git\luatest\metaTest.lua:(56): module 'lala' not found:
2 no field package.preload['lala']
3 no file '.\lala.lua'
4 no file 'D:\Program Files (x86)\LuaStudio\lua\lala.lua'
5 no file 'D:\Program Files (x86)\LuaStudio\lua\lala\init.lua'
6 no file 'D:\Program Files (x86)\LuaStudio\lala.lua'
7 no file 'D:\Program Files (x86)\LuaStudio\lala\init.lua'
8 no file 'C:\Program Files\Lua\5.1\lua\lala.luac'
9 no file 'F:\Git\luatest\lala.lua'
10 no file '.\lala.dll'
11 no file 'D:\Program Files (x86)\LuaStudio\lala.dll'
12 no file 'D:\Program Files (x86)\LuaStudio\loadall.dll'
13 Stack Traceback:
14 [C]: in function 'require'
15 F:\Git\luatest\metaTest.lua:56: in main chunk
这里可以很清晰的看见lua require方法搜索一个模块或者文件的流程会依次搜索文件名为lala.lua的文件或者dll
 
那么这些带有路径的lala.lua文件怎么来的的?很简单lua的模块路径是存在一个全局table package的path和cpath字段里的:
打印一下

1 print(package.path);
运行得到
1 ;.\?.lua;
2 D:\Program Files (x86)\LuaStudio\lua\?.lua;
3 D:\Program Files (x86)\LuaStudio\lua\?\init.lua
4 ;D:\Program Files (x86)\LuaStudio\?.lua;
5 D:\Program Files (x86)\LuaStudio\?\init.lua;
6 C:\Program Files\Lua\5.1\lua\?.luac;
7 F:\Git\luatest\?.lua
1 print(package.cpath);
.\?.dll;
D:\Program Files (x86)\LuaStudio\?.dll;
D:\Program Files (x86)\LuaStudio\loadall.dll
是不是很眼熟,是的当require的时候lua解释器会按照path 和cpath里存储的路径替换“?”去查询是否存在该文件,有则加载脚本或者模块亦或是C库。
 
了解了加载机制我们就可以很方便的去加载任何我们当前脚本依赖的外部模块:
'require("requiretest.loader");'
但是又一个问题,当我们想要加载当前脚本的上级目录或者其他目录的怎么办,这时候就需要自己去修改或者是添加相对路径,由于require的查询路径都是
存储在package.path中的这样我们就可以自行添加:
1 package.path = package.path ..';..\\?.lua';
 
测试下:在目录requiretest目录下新建loader.lua,在根目录下新建requiretest2目录并新建loader2.lua:
loader.lua:
1 require("requiretest2.loader2");
loader2.lua:
1 print("requiretest2.loader2");
 
运行:
1 requiretest2.loader2

在项目实际运用时可以根据需求加入相对目录。

些许浅薄认识 如有不妥之处望请斧正!!!!!

Lua require 相对路径的更多相关文章

  1. LUA require 搜索路径指定方法

    如果是一个 *.LUA 的文件, 里面用到了自己写的库, 或者第三方写的库, 但是你不想把它放到 lua 的安装目录里, 则在代码里面可以指定require搜索的路径. package.path = ...

  2. Lua require搜索路径指定方法

    在自己的lua文件中,如果使用到了自己写的C库或者第三方库,想让lua编译到自己指定的目录下寻找*.lua或*.so文件的时候,可以再自己的Lua代码中添加如下代码,可以指定require搜索的路径. ...

  3. lua require路径设置实例

    1.首先要强调的是,lua require的路径用的是斜杠"/",而不是从Windows文件属性那里复制来的反斜杠"\". 2.通过 print(pagckag ...

  4. ulua 路径小记 以及 lua require 机制整理

    ulua 路径小记 在学习ulua时,require模块的根路径可以为项目的Lua文件夹或者ToLua文件夹(Editor下),但是在package.path和package.cpath中并没有看到当 ...

  5. Lua Require函数

    转自:http://www.cppblog.com/cslover/archive/2013/12/21/204934.html Lua提供高级的require函数来加载运行库.粗略的说require ...

  6. 扩展 lua require 的行为

    扩展 lua require 的行为 来源 https://blog.codingnow.com/2015/10/lua_require_env.html 今天同事提了个需求,他希望可以给部分 lua ...

  7. unity lua require dofile loadfile 区别

    oadfile,加载文件,编译文件,并且返回一个函数,不运行 dofile其实就是包装了Loadfile,根据loadfile的返回函数运行一遍 require加载文件的时候,不用带目录,有lua自己 ...

  8. PHP中include和require绝对路径、相对路径问题

    在写PHP程序时,经常要用到include或require包含其他文件,但是各文件里包含的文件多了之后,就会产生路径问题. 如下目录: <web>(网站根目录) ├<A>文件夹 ...

  9. require的路径问题(比较重要)

    dojo.baseUrl baseUrl用来存储dojo.js存放 的跟目录,例如dojo.js的路径是“/web/scripts/dojo-1.3/dojo/dojo.js”则baseUrl为“/w ...

随机推荐

  1. Linux 文件目录结构

    /           文件系统的入口,最高一级目录 /bin           存放系统所需的基本命令 /boot     包含Linux内核及系统引导程序所需要的文件 ( 如连接文件,镜像文件等 ...

  2. MySQL查询本周、上周、本月、上个月份数据的sql脚本

    2018-11-13 查询今天的数据 select * from 表名 where to_days(时间字段名) = to_days(now()); 查询昨天的数据 SELECT * FROM 表名 ...

  3. AspectJ(AOP)切面获取参数名称和参数

    @Async @AfterReturning(value ="execution(public * com.zhx.recharge.service.RechargeService.buil ...

  4. supervisor 监控redis & mongodb

    安装 安装python brew install python 安装pipwget https://bootstrap.pypa.io/get-pip.pysudo python get-pip.py ...

  5. Django之Form组件(一)

    Django之Form组件(一) Django的Form主要具有一下几大功能: 生成HTML标签 验证用户数据(显示错误信息) HTML Form提交保留上次提交数据 初始化页面显示内容 基本操作:字 ...

  6. 正确实现用spring扫描自定义的annotation

    背景在使用spring时,有时候有会有一些自定义annotation的需求,比如一些Listener的回调函数. 比如: @Service public class MyService { @MyLi ...

  7. 彻底理解this 的值到底是什么?

    作者:方应杭 来源:知乎 你可能遇到过这样的 JS 面试题: var obj = { foo: function(){ console.log(this) } } var bar = obj.foo ...

  8. [Python] dict对象的keys()和values()返回的值,是否总是保证一一对应?

    搜dict的key, value顺序, 中文没搜到想要的结果. 英文答案链接:python-dictionary-are-keys-and-values-always-the-same-order 在 ...

  9. 潭州课堂25班:Ph201805201 django框架 第十课 GET,POST 请求 文件上传,HttpResponse,cookie (课堂笔记)

    在项目中新建个APP, 在主目录中的配置文件中进行 APP 注册 在主目录中的 urls 文件中进行路径分配 新建 urrls 文件 进行分路由配置 创建模板文件 html 文件 写个 form 表单 ...

  10. [USACO18JAN]Cow at Large P

    Description: 贝茜被农民们逼进了一个偏僻的农场.农场可视为一棵有 \(N\) 个结点的树,结点分别编号为 \(1,2,\ldots, N\) .每个叶子结点都是出入口.开始时,每个出入口都 ...