以自定义方式加载 lua 模块
来源:互联网 发布:sql去除重复字段 编辑:程序博客网 时间:2024/05/29 16:54
今天我们的一个小项目开始做内部测试发布前的资源打包。这个项目基本上是用 lua 做开发的。整个开发过程中,我们的代码是直接把 Lua 源代码放在项目的发布目录下的。发布版因为安全或是整洁等种种原因,我们必须给所有的脚本代码打包。
这种事情以前在大话2 里也干过,当时用的 lua 4.0 而且也没多少经验,我们是直接去修改的 lua 的代码,适应我们的打包格式。这次,不想这么干了。希望能够完全不动 lua 官方发布的源代码,来最终完成这项工作。
简单分析了一下,发现实现起来非常简单:
从 Lua 5.1 以后,Lua 有了标准的模块管理库。所以所有的模块加载都是通过 require 来完成。 require 的设计是颇具扩展性的,它会从若干个定义好的 loader 中逐个尝试加载新的模块。系统库中提供了四个 loader ,分别实现已加载模块,Lua 模块,和 C 扩展模块(用了两个 loader 来实现 C 扩展模块的加载)。这些 loader 以 CFunction 的形式放在 require 的环境中的一个 table 里。
如果我们想改变 lua 模块的加载形式,只需要替换或增加一个新的 loader 就可以了。
要做的只需要模仿 loadlib.c 中的 loader_Lua
函数做一个自己的实现,比如在我们的项目中,就允许从自定义格式数据包中,加载一个被加密过的 Lua 代码文件。然后写几行 C 代码,获得 require 的环境(使用 lua_getfenv
),然后取出其中 "loaders" 这个 table ,把新的自定义 loader 插入到 index 2 的地方。
具体的代码就不详述了,仔细阅读一下 ll_require
的实现(在 loadlib.c 中)就很容易明白。我们的整个工作从分析到实现没有超过两个小时,这真是得益于 Lua 良好的设计啊 :D 甚至如果你想从一个网络连接的数据流中加载 Lua 模块,或是通过 http/ftp 协议下载,也是行的通的吧。
原文地址:http://blog.codingnow.com/2007/04/user_define_lua_loader.html
- 以自定义方式加载 lua 模块
- 以自定义方式加载 lua 模块
- Lua自定义方式加载模块
- Lua自定义方式加载模块
- 【原创】Linux驱动入门之以模块方式加载驱动
- Lua动态加载模块
- lua 重新加载模块
- Lua动态加载模块
- Lua加载模块
- Lua 调用自定义C模块
- Lua 调用自定义C模块
- modprobe加载自定义模块
- 修改lua的文件加载器,自定义lua文件加载
- 修改lua的文件加载器,自定义lua文件加载
- 修改lua的文件加载器,自定义lua文件加载
- Lua 5.3 动态加载C模块
- 用preload加载Lua导出模块
- Lua 调用自定义C模块(练习)
- zoj 1560 Hansel and Grethel(求两条直线的交点)
- nodejs 自动回复
- JAVA配置登录过滤器和编码过滤器
- iOS开发- UICollectionView详解+实例
- Stanford机器学习---第二讲. 多变量线性回归 Linear Regression with multiple variable
- 以自定义方式加载 lua 模块
- 手机App的商业模式有哪些
- 快速视频图像上采样
- Struts2.3.16.1Hibernate4.3.4Spring4.0.2_框架 学习笔记
- JVM-GC总结-配置实战--第三发
- 理解JNDI中 java:comp/env/jdbc/datasource 与 jdbc/datasource 的不同之处
- HDU 1896 Stones
- android自动设置当前ImageView控件的颜色与其背景色相反
- [python]urllib与urllib2的常用函数