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. AtCoder Regular Contest 101 (ARC101) D - Median of Medians 二分答案 树状数组

    原文链接https://www.cnblogs.com/zhouzhendong/p/ARC101D.html 题目传送门 - ARC101D 题意 给定一个序列 A . 定义一个序列 A 的中位数为 ...

  2. 2018-05-01T00:00:00.000+08:00转2018-05-01 00:00:00

    /** * 2018-05-01T00:00:00.000+08:00转2018-05-01 00:00:00 * @param oldDateStr * @return * @throws Pars ...

  3. 2501 矩阵距离 (bfs)

    描述 给定一个N行M列的01矩阵 A,A[i][j] 与 A[k][l] 之间的曼哈顿距离定义为: dist(A[i][j],A[k][l])=|i-k|+|j-l| 输出一个N行M列的整数矩阵B,其 ...

  4. Springmvc借助SimpleUrlHandlerMapping实现接口开关功能

    一.接口开关功能 1.可配置化,依赖配置中心 2.接口访问权限可控 3.springmvc不会扫描到,即不会直接的将接口暴露出去 二.接口开关使用场景 和业务没什么关系,主要方便查询系统中的一些状态信 ...

  5. Linux学习笔记10

    创建文件 touch touch filenames 创建文件夹 mkdir mkdir dir3 dir4 dir5 建立多个文件夹 mkdir ~/games  在登录用户的本目录之下建立game ...

  6. jquery实时获取时间

    $(document).ready(function(){ function time(){ var date=new Date(); var h=date.getHours(); var m=dat ...

  7. 1038. Jewels And Stones

    描述 给定字符串J代表是珠宝的石头类型,而S代表你拥有的石头.S中的每个字符都是你拥有的一个石头. 你想知道你的石头有多少是珠宝. J中的字母一定不同,J和S中的字符都是字母. 字母区分大小写,因此& ...

  8. 6. 合并排序数组 II

    6. Merge Two Sorted Arrays Description Merge two given sorted integer array A and B into a new sorte ...

  9. BZOJ.5249.[九省联考2018]iiidx(贪心 线段树)

    BZOJ LOJ 洛谷 \(d_i\)不同就不用说了,建出树来\(DFS\)一遍. 对于\(d_i\)不同的情况: Solution 1: xxy tql! 考虑如何把这些数依次填到树里. 首先对于已 ...

  10. 186. [USACO Oct08] 牧场旅行

    186. [USACO Oct08] 牧场旅行(点击转到COGS) 输入文件:pwalk.in   输出文件:pwalk.out 时间限制:1 s   内存限制:128 MB 描述 n个被自然地编号为 ...