文章目录

当我们require一个lua脚本或动态库时,lua到底是如何搜索到这个文件的呢?

首先require会从package.loaded中查看这个文件是否已经加载过,如果加载过将直接返回上次加载的结果,否则将会调用依次调用4个函数去查找,知道这4个函数都无法找到就报错。

最先被调用的函数会从package.preload这个table中查找key为这个require值的函数,如果有则运行这个函数并保存得到返回值。因此我们可以自己给preload中添加一些我们自己的加载函数,如:

1
2
3
4
package.preload["xxx"] = function()
print("this is xxx!")
end
require("xxx")

如果preload中没有的话则会从package.path中保存的路径去搜索相应的lua文件,然后把文件作为一个函数执行并获得返回值。因此我们可以通过修改package.path的值让require可以搜索我们希望他搜索的路径。

此时若搜索不到则会从package.cpath中保存的路径去搜索相应的动态链接库文件。若能找到这个文件则会加载链接库,并加载和执行相应的luaopen_X函数得到结果。因次我们也可以通过修改package.cpath的值让require可以搜索我们指定的路径。

若这时还是没找到文件则依旧按package.cpath中的路径去查找链接库,不过这次会按照子库的形式去查找,如require(“xxx.aaa”)。lua会去查找名字为”xxx”的动态库找到后就去加载luaopen_xxx_aaa这个函数执行。

根据这个流程,我们可以发现修改package.path和package.cpath可以让lua更方便,更快的找到我们指定的文件,尤其是通常我们会把自己写好的库放在一个指定的文件夹下面,在使用时又想直接require这个文件,而不想加路径。这时直接修改这两个值就能够达到目的了。

文章目录