| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360 |
- <!DOCTYPE html>
- <html lang="en">
- <head>
- <meta charset="UTF-8">
- <title>xmake</title>
- <link rel="icon" href="/assets/img/favicon.ico">
- <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
- <meta name="description" content="Description">
- <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
- <link href="/assets/npm/github-markdown/github-markdown.min.css" rel="stylesheet">
- <style>
- .markdown-body {
- box-sizing: border-box;
- min-width: 200px;
- max-width: 980px;
- margin: 0 auto;
- padding: 45px;
- }
- @media (max-width: 767px) {
- .markdown-body {
- padding: 15px;
- }
- }
- </style>
- </head>
- <body>
- <article class="markdown-body">
- <h4>This is a mirror page, please see the original page: </h4><a href="https://xmake.io/#/zh-cn/manual/plugin_task">https://xmake.io/#/zh-cn/manual/plugin_task</a>
- <div id="wwads-panel" class="wwads-cn wwads-vertical wwads-sticky" data-id="239" style="max-width:180px;bottom:20px;right:20px;width:200px;height:260px;background:#fff;position:fixed"></div>
- </br>
- <script type="text/javascript" charset="UTF-8" src="https://cdn.wwads.cn/js/makemoney.js" async></script>
- <script async type="text/javascript" src="//cdn.carbonads.com/carbon.js?serve=CE7I52QU&placement=xmakeio" id="_carbonads_js"></script>
- <style>
- #carbonads {
- font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu,
- Cantarell, "Helvetica Neue", Helvetica, Arial, sans-serif;
- }
- #carbonads {
- display: flex;
- max-width: 330px;
- background-color: hsl(0, 0%, 98%);
- box-shadow: 0 1px 4px 1px hsla(0, 0%, 0%, .1);
- }
- #carbonads a {
- color: inherit;
- text-decoration: none;
- }
- #carbonads a:hover {
- color: inherit;
- }
- #carbonads span {
- position: relative;
- display: block;
- overflow: hidden;
- }
- #carbonads .carbon-wrap {
- display: flex;
- }
- .carbon-img {
- display: block;
- margin: 0;
- line-height: 1;
- }
- .carbon-img img {
- display: block;
- }
- .carbon-text {
- font-size: 13px;
- padding: 10px;
- line-height: 1.5;
- text-align: left;
- }
- .carbon-poweredby {
- display: block;
- padding: 8px 10px;
- background: repeating-linear-gradient(-45deg, transparent, transparent 5px, hsla(0, 0%, 0%, .025) 5px, hsla(0, 0%, 0%, .025) 10px) hsla(203, 11%, 95%, .4);
- text-align: center;
- text-transform: uppercase;
- letter-spacing: .5px;
- font-weight: 600;
- font-size: 9px;
- line-height: 1;
- }
- </style>
- <p>xmake可以实现自定义任务或者插件,其两者的核心就是<code>task</code>任务,其两者实际上是一样的,xmake的插件都是用<code>task</code>实现的。</p>
- <p>本质上都是任务,只是<a href="#taskset_category">set_category</a>分类不同而已。</p>
- <table>
- <thead>
- <tr>
- <th>接口</th>
- <th>描述</th>
- <th>支持版本</th>
- </tr>
- </thead>
- <tbody>
- <tr>
- <td><a href="#task">task</a></td>
- <td>定义插件或者任务</td>
- <td>>= 2.0.1</td>
- </tr>
- <tr>
- <td><a href="#task_end">task_end</a></td>
- <td>结束定义插件或任务</td>
- <td>>= 2.1.1</td>
- </tr>
- <tr>
- <td><a href="#taskset_menu">set_menu</a></td>
- <td>设置任务菜单</td>
- <td>>= 2.0.1</td>
- </tr>
- <tr>
- <td><a href="#taskset_category">set_category</a></td>
- <td>设置任务类别</td>
- <td>>= 2.0.1</td>
- </tr>
- <tr>
- <td><a href="#taskon_run">on_run</a></td>
- <td>设置任务运行脚本</td>
- <td>>= 2.0.1</td>
- </tr>
- </tbody>
- </table>
- <h3 id="task">task</h3>
- <h4 id="">定义插件或者任务</h4>
- <p><code>task</code>域用于描述一个自定义的任务实现,与<a href="#target">target</a>和<a href="#option">option</a>同级。</p>
- <p>例如,这里定义一个最简单的任务:</p>
- <pre><code class="lang-lua">task("hello")
- -- 设置运行脚本
- on_run(function ()
- print("hello xmake!")
- end)
- </code></pre>
- <p>这个任务只需要打印<code>hello xmake!</code>,那如何来运行呢?</p>
- <p>由于这里没有使用<a href="#taskset_menu">set_menu</a>设置菜单,因此这个任务只能再<code>xmake.lua</code>的自定义脚本或者其他任务内部调用,例如:</p>
- <pre><code class="lang-lua">target("test")
- after_build(function (target)
- -- 导入task模块
- import("core.project.task")
- -- 运行hello任务
- task.run("hello")
- end)
- </code></pre>
- <p>在构建完<code>test</code>目标后运行<code>hello</code>任务。</p>
- <h3 id="task_end">task_end</h3>
- <h4 id="">结束定义插件或任务</h4>
- <p>这是一个可选api,显示离开选项作用域,用法和<a href="#target_end">target_end</a>类似。</p>
- <h3 id="taskset_menu">task:set_menu</h3>
- <h4 id="">设置任务菜单</h4>
- <p>通过设置一个菜单,这个任务就可以开放给用户自己通过命令行手动调用,菜单的设置如下:</p>
- <pre><code class="lang-lua">task("echo")
- -- 设置运行脚本
- on_run(function ()
- -- 导入参数选项模块
- import("core.base.option")
- -- 初始化颜色模式
- local modes = ""
- for _, mode in ipairs({"bright", "dim", "blink", "reverse"}) do
- if option.get(mode) then
- modes = modes .. " " .. mode
- end
- end
- -- 获取参数内容并且显示信息
- cprint("${%s%s}%s", option.get("color"), modes, table.concat(option.get("contents") or {}, " "))
- end)
- -- 设置插件的命令行选项,这里没有任何参数选项,仅仅显示插件描述
- set_menu {
- -- 设置菜单用法
- usage = "xmake echo [options]"
- -- 设置菜单描述
- , description = "Echo the given info!"
- -- 设置菜单选项,如果没有选项,可以设置为{}
- , options =
- {
- -- 设置k模式作为key-only型bool参数
- {'b', "bright", "k", nil, "Enable bright." }
- , {'d', "dim", "k", nil, "Enable dim." }
- , {'-', "blink", "k", nil, "Enable blink." }
- , {'r', "reverse", "k", nil, "Reverse color." }
- -- 菜单显示时,空白一行
- , {}
- -- 设置kv作为key-value型参数,并且设置默认值:black
- , {'c', "color", "kv", "black", "Set the output color."
- , " - red"
- , " - blue"
- , " - yellow"
- , " - green"
- , " - magenta"
- , " - cyan"
- , " - white" }
- -- 设置`vs`作为values多值型参数,还有`v`单值类型
- -- 一般放置在最后,用于获取可变参数列表
- , {}
- , {nil, "contents", "vs", nil, "The info contents." }
- }
- }
- </code></pre>
- <p>定义完这个任务后,执行<code>xmake --help</code>,就会多出一个任务项来:</p>
- <pre><code>Tasks:
- ...
- echo Echo the given info!
- </code></pre><p>如果通过<a href="#taskset_category">set_category</a>设置分类为<code>plugin</code>,那么这个任务就是一个插件了:</p>
- <pre><code>Plugins:
- ...
- echo Echo the given info!
- </code></pre><p>想要手动运行这个任务,可以执行:</p>
- <pre><code class="lang-bash">$ xmake echo hello xmake!
- </code></pre>
- <p>就行了,如果要看这个任务定义的菜单,只需要执行:<code>xmake echo [-h|--help]</code>,显示结果如下:</p>
- <pre><code class="lang-bash">Usage: $xmake echo [options]
- Echo the given info!
- Options:
- -v, --verbose Print lots of verbose information.
- --backtrace Print backtrace information for debugging.
- --profile Print performance data for debugging.
- --version Print the version number and exit.
- -h, --help Print this help message and exit.
- -F FILE, --file=FILE Read a given xmake.lua file.
- -P PROJECT, --project=PROJECT Change to the given project directory.
- Search priority:
- 1. The Given Command Argument
- 2. The Envirnoment Variable: XMAKE_PROJECT_DIR
- 3. The Current Directory
- -b, --bright Enable bright.
- -d, --dim Enable dim.
- --, --blink Enable blink.
- -r, --reverse Reverse color.
- -c COLOR, --color=COLOR Set the output color. (default: black)
- - red
- - blue
- - yellow
- - green
- - magenta
- - cyan
- - white
- contents ... The info contents.
- </code></pre>
- <p><p class="tip"><br>其中菜单最开头的部分选项,是xmake内置的常用选项,基本上每个任务都会用到,不需要自己额外定义,简化菜单定义。<br></p>
- </p>
- <p>下面,我们来实际运行下这个任务,例如我要显示红色的<code>hello xmake!</code>,只需要:</p>
- <pre><code class="lang-bash">$ xmake echo -c red hello xmake!
- </code></pre>
- <p>也可以使用选项全名,并且加上高亮:</p>
- <pre><code class="lang-bash">$ xmake echo --color=red --bright hello xmake!
- </code></pre>
- <p>最后面的可变参数列表,在<code>run</code>脚本中通过<code>option.get("contents")</code>获取,返回的是一个<code>table</code>类型的数组。</p>
- <h3 id="taskset_category">task:set_category</h3>
- <h4 id="">设置任务类别</h4>
- <p>仅仅用于菜单的分组显示,当然插件默认会用<code>plugin</code>,内置任务默认会用:<code>action</code>,但也仅仅只是个约定。</p>
- <p>!> 你可以使用任何自己定义的名字,相同名字会分组归类到一起显示,如果设置为<code>plugin</code>,就会显示到xmake的Plugins分组中去。</p>
- <p>例如:</p>
- <pre><code class="lang-lua">Plugins:
- l, lua Run the lua script.
- m, macro Run the given macro.
- doxygen Generate the doxygen document.
- project Generate the project file.
- hello Hello xmake!
- app2ipa Generate .ipa file from the given .app
- echo Echo the given info!
- </code></pre>
- <p>如果没有调用这个接口设置分类,默认使用<code>Tasks</code>分组显示,代表普通任务。</p>
- <h3 id="taskon_run">task:on_run</h3>
- <h4 id="">设置任务运行脚本</h4>
- <p>可以有两种设置方式,最简单的就是设置内嵌函数:</p>
- <pre><code class="lang-lua">task("hello")
- on_run(function ()
- print("hello xmake!")
- end)
- </code></pre>
- <p>这种对于小任务很方便,也很简洁,但是对于大型任务就不太适用了,例如插件等,需要复杂的脚本支持。</p>
- <p>这个时候就需要独立的模块文件来设置运行脚本,例如:</p>
- <pre><code class="lang-lua">task("hello")
- on_run("main")
- </code></pre>
- <p>这里的<code>main</code>设置为脚本运行主入口模块,文件名为<code>main.lua</code>,放在定义<code>task</code>的<code>xmake.lua</code>的同目录下,当然你可以起其他文件名。</p>
- <p>目录结构如下:</p>
- <pre><code>projectdir
- - xmake.lua
- - main.lua
- </code></pre><p><code>main.lua</code>里面内容如下:</p>
- <pre><code class="lang-lua">function main(...)
- print("hello xmake!")
- end
- </code></pre>
- <p>就是一个简单的带<code>main</code>主函数的脚本文件,你可以通过<a href="/mirror/zh-cn/manual/builtin_modules.html#import">import</a>导入各种扩展模块,实现复杂功能,例如:</p>
- <pre><code class="lang-lua">-- 导入参数选项模块
- import("core.base.option")
- -- 入口函数
- function main(...)
- -- 获取参数内容
- print("color: %s", option.get("color"))
- end
- </code></pre>
- <p>你也可以在当前目录下,创建多个自定义的模块文件,通过<a href="/mirror/zh-cn/manual/builtin_modules.html#import">import</a>导入后使用,例如:</p>
- <pre><code>projectdir
- - xmake.lua
- - main.lua
- - module.lua
- </code></pre><p><code>module.lua</code>的内容如下:</p>
- <pre><code class="lang-lua">-- 定义一个导出接口
- function hello()
- print("hello xmake!")
- end
- </code></pre>
- <p><p class="tip"><br>私有接口,通过<code>_hello</code>带下滑线前缀命名,这样导入的模块就不会包含此接口,只在模块自身内部使用。<br></p>
- </p>
- <p>然后在<code>main.lua</code>进行调用:</p>
- <pre><code class="lang-lua">import("module")
- function main(...)
- module.hello()
- end
- </code></pre>
- <p>更多模块介绍见:<a href="/mirror/zh-cn/manual/builtin_modules.html">内置模块</a>和<a href="/mirror/zh-cn/manual/extension_modules.html">扩展模块</a></p>
- <p>其中,<code>main(...)</code>中参数,是通过<code>task.run</code>指定的,例如:</p>
- <pre><code class="lang-lua">task.run("hello", {color="red"}, arg1, arg2, arg3)
- </code></pre>
- <p>里面的<code>arg1, arg2</code>这些就是传入<code>hello</code>任务<code>main(...)</code>入口的参数列表,而<code>{color="red"}</code>用来指定任务菜单中的参数选项。</p>
- <p>更加详细的<code>task.run</code>描述,见:<a href="#task-run">task.run</a></p>
- </article>
- </body>
- </html>
|