--- title: 插件开发之参数配置 tags: [xmake, 插件, 菜单选项] date: 2016-06-09 author: Ruki outline: deep --- 我们继续以之前讲解的hello插件为基础,现在为其增加参数配置选项,并且指定一个独立的脚本文件中进行开发,这样我们就可以写一些更复杂的插件 ```lua -- 定义一个名叫hello的插件任务 task("hello") -- 设置类型为插件 set_category("plugin") -- 插件运行的入口,这里指定main,说明从当前插件目录的main.lua脚本中加载插件入口 on_run("main") -- 设置插件的命令行选项,这里没有任何参数选项,仅仅显示插件描述 set_menu({ -- usage usage = "xmake hello [options]" -- description , description = "Hello xmake!" -- 定义两个参数选项 -- xmake hello --output="xxx" 指定输出的内容 -- xmake hello -v 显示插件版本 , options = { -- 第一个值设置简写:xmake hello -o xxx -- 第二个值设置全称:xmake hello --output=xxx -- 第三个值设置类型:kv是键值对,k是仅有key没有值(-v --version),v是值类型没有key -- 第四个值指定参数描述信息 {'o', "output", "kv", nil, "Set the output content." } , {'v', "version", "k", "1.0", "Show the version." } } }) ``` 这个插件的文件结构如下: ``` hello - xmake.lua - main.lua ``` xmake.lua为插件的描述文件,指定一些描述信息,main.lua为插件运行入口,代码如下: ```lua -- 导入选项模块 import("core.base.option") -- main.lua入口函数 function main() -- 显示版本? if option.get("version") then print("version: %s", option.get("version")) else -- 显示内容 print("hello %s!", option.get("output") or "xmake") end end ``` 到此一个稍微高级些插件就完成了,我们只需要执行: ```bash xmake hello --version xmake hello -v ``` 来显示版本,执行: ```bash xmake hello -o xxx xmake hello --output=xxx ``` 来显示内容,或者执行: ```bash xmake hello -h xmake hello --help ``` 来显示菜单,这个选项是内置的,不需要自定义 其中,我们用到了[import](https://xmake.io/zh/)这个api,这个api主要用于导入一些扩展的类库,实现一些高级的功能 并且还可以导入一些自定义的模块,例如我想在当前这个插件目录下新增一个模块 echo 用于回显信息,可以在hello目录下增加一个脚本文件: ``` hello - xmake.lua - main.lua - echo.lua ``` echo.lua的内容如下: ```lua -- 增加一个显示信息的接口show function show(info) print(info) end ``` 然后在main.lua里面导入这个模块就可以使用了: ```lua -- 导入选项模块 import("core.project.option") -- 导入当前插件目录下echo模块 import("echo") -- main.lua入口函数 function main() -- 使用echo模块来显示 if option.get("version") then echo.show("version: %s", option.get("version")) else -- 显示内容 echo.show("hello %s!", option.get("output") or "xmake") end end ``` 怎么样,简单吧import后,就可以直接使用这个模块的所有公有接口,像show就是被导出的公有接口 如果一些接口是私有的不想被导出怎么办呢,只需要加上 _ 前缀就行了,例如: ```lua -- 私有接口 function _print(info) print(info) print(_g.info) end -- 公有接口 function show(info) _print(info) _g.info = info end ``` 注:其中_g是全局私有变量,用于模块内部全局私有数据的维护和传递