Lua require的路径

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

require("lala");

 这样运行会得到一个报错:

1>F:\Git\luatest\metaTest.lua:(56): module 'lala' not found:
    no field package.preload['lala']
    no file '.\lala.lua'
    no file 'D:\Program Files (x86)\LuaStudio\lua\lala.lua'
    no file 'D:\Program Files (x86)\LuaStudio\lua\lala\init.lua'
    no file 'D:\Program Files (x86)\LuaStudio\lala.lua'
    no file 'D:\Program Files (x86)\LuaStudio\lala\init.lua'
    no file 'C:\Program Files\Lua\5.1\lua\lala.luac'
    no file 'F:\Git\luatest\lala.lua'
    no file '.\lala.dll'
    no file 'D:\Program Files (x86)\LuaStudio\lala.dll'
    no file 'D:\Program Files (x86)\LuaStudio\loadall.dll'
Stack Traceback:
    [C]: in function 'require'
    F:\Git\luatest\metaTest.lua:56: in main chunk

这里可以很清晰的看见lua require方法搜索一个模块或者文件的流程会依次搜索文件名为lala.lua的文件或者dll

 

那么这些带有路径的lala.lua文件怎么来的的?很简单lua的模块路径是存在一个全局table package的path和cpath字段里的:

打印一下

print(package.path);

运行得到

./?.lua;/usr/share/lua/5.1/?.lua;/usr/share/lua/5.1/?/init.lua;/usr/lib64/lua/5.1/?.lua;/usr/lib64/lua/5.1/?/init.lua;/usr/local/freeswitch/scripts/?.lua
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中的这样我们就可以自行添加:

 package.path = package.path ..';..\\?.lua';

测试下:在目录requiretest目录下新建loader.lua,在根目录下新建requiretest2目录并新建loader2.lua:

loader.lua:

require("requiretest2.loader2");

 

loader2.lua:

print("requiretest2.loader2");

运行:

requiretest2.loader2

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

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值