提供一个小工具,自动将项目中的 lua 代码合并成一个文件
工具地址:https://www.npmjs.org/package/lua-distiller
[size=6]lua-distiller[/size]
Intelligently merge multiple lua file into one single lua file by analyzing require
分析 lua 代码中的 require 依赖,将分散的n个 lua 文件拼合成一个单一的 lua 文件
[size=5]Install 安装[/size]
[pre][size=2][font=monaco, monospace][color=#666666][backcolor=#f9f9f8]npm install coffee[color=#333333]-[/color]script lua[color=#333333]-[/color]distiller [color=#333333]-[/color]g[/pre][size=5]Usage 用法[/size]
Use in command line
[pre]lua[color=#333333]-[/color]distill [color=#333333]-[/color]i path[color=#333333]/[/color]to[color=#333333]/[/color]main[color=#333333].[/color]lua [color=#333333]-[/color]o dist[color=#333333]/[/color]dist[color=#333333].[/color]lua[/backcolor][/color][/font][/size][/pre][size=5]Command line options 命令行参数[/size]
[list][li]-h, --help output usage information[/li][li]-V, --version output the version number[/li][li]-o, --output [VALUE] output directory[/li][li]-i, --input [VALUE] path to main entrance coffee file[/li][/list][size=5]How it works 原理[/size]
这个工具采用和 node-coffee-distiller 相同的工作原理,用户给定一个入口文件,这个工具自动递归地分析入口文件中的依赖,然后将依赖和入口文件合并到一个输出结果。
[size=4]这个工具派什么用?[/size]
当 lua 项目在一个完全嵌入的环境中被执行时,需要有一个方便发布快捷的生产环境发布部署载体。这个工具就是为了满足这个需求而设计的。
类似的工具包括 luac -o, luajit, squish, 但是这3个工具都需要手动维护合并列表,这无疑给始终在变化的项目增加了额外的工作量和出错的可能。
[size=4]模拟 require[/size]
lua 的 require 实现是通过调用 package.preload 和 LOADED table 来确保一个模块只被加载一次。当分散的 lua 文件合并成一体之后,不在存在外部需要 require 的文件,因此在合并的文件中采用模拟 require 的方式。 具体而言,使用一个全局变量 __DEFINED table 来保存所有合并入的依赖。然后对每个被合并入的文件都使用(function() end)() 来确保入口方法被执行前,被合并入的方法体已经完成自我的静态初始化。
[size=4]优点[/size]
[list=1][li]自动分析lua代码,无需手工维护合并列表[/li][li]忽略被注释掉的 require[/li][li]自动忽略项目中没有被用到的 lua 代码[/li][li]可以嵌套地合并,比如一个项目中使用到n给第三方代码库,这些代码库都通过 distiller 合并过的话,将他们合并在一起不会产生冲突,是兼容的。[/li][/list][size=4]缺点[/size]
[list=1][li]无法识别运行时程序拼合的模块名,比如 quick-x 中的 require(cc.PACKAGE_NAME … ".functions")是无法被识别的。并且我个人认为运行时拼合模块名是一种风险相对较大的实现,不推荐这样做。[/li][/list][size=5]TODO:[/size]
[list=1][li]增加 lua 基本库的依赖忽略列表[/li][li]增加 luac 的命令行参数[/li][/list][size=5]License[/size]
MIT