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. vue中的provide/inject的学习使用

    irst:定义一个parent component ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 <template>  <div> ...

  2. 数学模型:3.非监督学习--聚类分析 和K-means聚类

    1. 聚类分析 聚类分析(cluster analysis)是一组将研究对象分为相对同质的群组(clusters)的统计分析技术 ---->> 将观测对象的群体按照相似性和相异性进行不同群 ...

  3. create-react-app项目添加less配置

    使用create-react-app 创建的项目默认不支持less,以下增加less配置的步骤 暴露配置文件 create-react-app生成的项目文,看不到webpack相关的配置文件,需要先暴 ...

  4. Hdu-1098解题报告

    Hdu-1098解题报告 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1098 题意:已知存在一个等式f(x)=5*x^13+13*x^5+k*a*x ...

  5. SVM:SVM之Classification根据已有大量数据集案例,输入已有病例的特征向量实现乳腺癌诊断高准确率预测—Jason niu

    load BreastTissue_data.mat n = randperm(size(matrix,1)); train_matrix = matrix(n(1:80),:); train_lab ...

  6. 589. N叉树的前序遍历

    [题目] 给定一个 N 叉树,返回其节点值的前序遍历. 例如,给定一个 3叉树 : 返回其前序遍历: [1,3,5,6,2,4]. [解析] """ # Definiti ...

  7. hdu 2553 n皇后问题【DFS递归解法】

    <题目链接> 题目大意: Problem Description 在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45 ...

  8. Nginx配置以及域名转发

    工程中的nginx配置 #user nobody; worker_processes 24; error_log /home/xxx/opt/nginx/logs/error.log; pid /ho ...

  9. CSS-变量

    为什么使用 css variables 借用Scrimba上的: easier to get started (no transpiling) have access to the DOM 1.loc ...

  10. python简单名片管理系统