#module #lua #tree #macro #proc-macro #source #include-lua

include-lua-macro

包含为crate include-lua实现的include_lua!进程宏的实现

3个版本

0.1.2 2019年3月29日
0.1.1 2019年3月29日
0.1.0 2019年3月29日

#223#lua


include-lua 中使用

MIT 协议

5KB
73

include-lua

include-lua 是一个crate,允许将Lua源树嵌入到Rust应用程序的二进制文件中。然后可以将此树加载到rlua上下文中,并通过 require 从它导入代码。

基本用法

首先,通过宏 include_lua! 创建 LuaModules 结构体的实例。此宏接受一个字符串字面量参数,指定一个目录,相对于您的crate的 src 文件夹。此目录及其子目录中的所有 .lua 文件都将包含为可加载模块。

一旦创建了 LuaModules 结构体,您可以通过调用 ctx..add_modules(modules) 将其导入到 rlua::Context 中。这是一个由特质提供的扩展方法,因此请确保您的代码中有 use include_lua::*; 语句。一旦调用,该上下文中执行的任何 require 调用都将能够从嵌入的源树中加载模块。

高级用法

可以为 LuaModules 结构体指定一个名称,该名称将在其内部的任何代码的堆栈跟踪中出现。只需像下面这样调用 include_lua 宏:include_lua!("name": "path"),而不是只调用 include_lua!("path")

如果您出于某种原因想在自定义环境中加载模块,而不是使用 ctx.add_modules,您可以调用 ctx.add_modules_with_env(modules, env),其中 env 是一个表,它将被用作源树中所有模块的 _ENV 值。

方法 ctx.make_searcher(modules)ctx.make_searcher_with_env(modules, env) 也可用。它们产生一个用户数据,在 Lua 代码中,它像是一个函数,可以通过名称从源树中加载模块。

作为低级方法,make_searchermake_searcher_with_env 返回的值不缓存模块,就像 require 一样。这意味着,如果您想避免使用相同名称多次调用加载相同模块的多个副本,您必须在 Lua 代码中实现包装器。

示例

请参阅 example/main.rs 以了解宏的使用示例。

注意事项

目前,此 crate 不支持包含非 Unicode 字符的路径。沿这些路径的任何文件都将被从 include_lua! 调用中省略。

依赖项

~2–9MB
~86K SLoC