lua5.2后, 官方建议大家放弃module/package机制, 这套机制对于使用者来说是方便的, 对于module的编写者简直要抓狂, 所有module后的函数对_G均不可见, 还要一个个手动在module前转成local调用. 相当反人类. 官方建议大家手动实现package机制. 本博客之前有实现过, 参考http://www.cppblog.com/sunicdavy/archive/2013/12/10/204696.html
由于要使用protoc-gen-lua, 这东西生成出来的lua依然使用官方的module/package机制. 对于游戏项目来说, 想进行一些自定义读取, 加密等, 就变得不可能. 幸好官方在扩展上支持的还是不错的.
参考lua5.2的官方文档http://www.lua.org/manual/5.2/manual.html#pdf-require
require时, lua会自动根据一定的搜索规律找到加载代码的方法. 这个方法定义在package.searchers这个数组中. 一共有4个加载搜索顺序
1. preload, 对已加载的module进行直接返回, 对应package.preload[modname]
2. lualoader, 对lua文件进行加载, 搜索路径为package.path
3. cloader, 对lua标准dll进行加载, 搜索路径为package.cpath
4. croot, 官方文档说的是all-in-one加载器, 感觉很神奇, 感兴趣可以自行参考源码
那么, 如果只需要自己的加载器, 只需要这样做:
package.searchers[2] = function( name )
print("try to load", name )
end
package.searchers[3] = nil
package.searchers[4] = nil
require "libtest"
只保留preload功能, 然后将第二个加载器换成自己的加载函数, 第三,第四直接屏蔽