---
title: "Advanced Feature: Custom Task"
tags: [xmake, task, custom script, plugin]
date: 2016-06-09
author: Ruki
outline: deep
---

`task` is a new feature starting from xmake 2.0 and is also the core of plugin development. In [Plugin Development: Hello xmake](https://xmake.io/) we briefly introduced the definition and usage of tasks.

Of course, tasks can not only be used to write plugins, but also to write some simple custom tasks.

Let's first look at a simple task implementation:

```lua
    -- Define a task named hello
    task("hello")

        -- Entry point for task execution
        on_run(function ()

            -- Display hello xmake!
            print("hello xmake!")

        end)
```

This is the simplest task. Compared to plugin tasks, it lacks the `set_menu` setting. Of course, you can also add it, so it can be called from the command line.

And this `hello` task doesn't have `set_menu` set, so it can only be called in custom scripts.

```lua
    target("demo")

        -- Custom clean action
        on_clean(function(target)

            -- Import task module
            import("core.project.task")

            -- Run this hello task
            task.run("hello")
        end)
```

If you want to add parameter passing, there are two ways:

1. Add a command-line option menu through `set_menu`, and access parameters through the `option` module (supports command-line and script parameter passing)
2. Directly pass parameters through scripts

Let's first look at the second method, which is simpler. It doesn't need to define a command-line menu. You only need to agree on parameter rules between the task definition and the call site:

```lua
    -- Direct parameter passing, {} is for the first option parameter passing, leave it empty here
    -- Here we pass two parameters at the end: arg1, arg2
    task.run("hello", {}, "arg1", "arg2")
```

So how to get these two parameters?

```lua
    -- Define a task named hello
    task("hello")

        -- Entry point for task execution, defined with two parameters
        on_run(function (arg1, arg2)

            -- Display hello xmake!
            print("hello xmake: %s %s!", arg1, arg2)

        end)
```

How simple is that? Of course, this parameter passing method cannot pass parameters externally through the command line, so it's generally used for some built-in task calls. For advanced tasks like plugins, the first parameter passing method is needed.

For details, please refer to: [Plugin Development: Parameter Configuration](https://xmake.io/)

