Awesome
Z
Z is a simple and useful task runner.
Overview
Philosophy
- Simple
- Easy
- Intuitive
- Useful
Features
- Nested tasks
- Default task
- Alias
- Shorthand
- And more...
Installation
Via gobinaries
curl -sSL gobinaries.com/zakuro9715/z | sh
By go install
go install github.com/zakuro9715/z
Compare with other tools
Robo
Z is strongly inspired by Robo
Good
- Easy to use
- Simple configuration
- Easy to install
Bad
- No nested tasks
- Not enough features
- No default task
Make
Good
- Easy to use
- Run anyware
Cons
- Make is not task runner
- Makefile is difficult
- No nested tasks
npm script
Pros
- Easy to use
- Simple configuration
- No extra tool is required in nodejs project.
Cons
- Not suitable for other than nodejs project
- No nested tasks
- script must be one-liner
Task (go-task/task)
Pros
- Many features
- Good documentation
Cons
- No nested tasks
- Too many features
Usage
z tasks... args...
Config
Run
Run with specified shell (default: sh)
tasks:
hello:
run:
- echo hello1
- echo hello2
$ z hello
# It runs
sh -c "echo hello1"
sh -c "echo hello2"
run
can be omitted
tasks:
hello: echo hello
Shorthand
tasks:
hello.world: echo hello world
$ z hello world
hello world
$ z hello.world
hello world
Args
Args will be passed. You can use it as $@
. If args.passthrough == true, args will be embedded in each commands
$ cat z.yaml
tasks:
hello: echo hello $@
hiho:
run:
- echo hi
- echo ho
args:
passthrough: true
$ z hello world
# It runs
sh -c "echo hello" "sh" "world"
$ z hiho world
# It runs
sh -c "echo hi world"
sh -c "echo ho world"
Default task
You can use default task
default: hello.world
tasks:
hello:
tasks:
world: echo hello world
$ z
hello world
Task Alias
Just use z as command. Config will be inherited.
# myconfig.yaml
tasks:
hello.world: echo hello world
helloworld: z hello world # same as `z --config=myconfig.yaml hello world`
$z --config=myconfig.yaml helloworld
hello world
Of course, you can use another config
tasks:
hello:
tasks:
a: z --config=a.yaml hello
b: z --config=b.yaml hello
Env
env:
- KEY=VALUE
tasks:
echo: echo $KEY
$ z echo
VALUE
Variable
var:
seq: seq 3
tasks:
count: {{seq}} | cat # seq 10
$ z count
1
2
3
PATH
You can specify additional PATH
tasks:
hello:
path: ./bin
run: command-in-bin-dir
Use cases
Examples
See also Examples Test
tasks:
compile:
run:
- clang $@
desc: Compile
hooks:
pre: echo Compiling
post: echo Compiled
tasks:
main:
run:
- z -c examples/cc.yaml compile main.c
shell: bash # Shell to run commands
default: hello.world # Default task. hello.world -> z hello world
disable_help: false # If true, don't show z's help and --help flag is handled same as other flags
env:
MESSAGE: message # It used if environment variable does not exist.
var:
value: value
tasks: # Task list
hello: # Task name
desc: Say hello # Task description
run: # Commands to run
- echo hello $@ #
args:
required: true # Required one more arguments
default: you # Default argument
hooks: # hooks
pre: echo saying hello # pre hook
post: echo said hello # post hook
tasks: # Sub task list
script:
run: examples/hello.sh # Run script
script.with_path:
path: examples # Add path
run: hello.sh
python:
shell: python
run: print('hello python')
hello.world: # Sub task shorthand (Task will be 'z hello world')
run:
- z hello -- world # after -- is args (not subtask name)
args:
passthrough: true # passthrough arguments. So `z hello.world arg` will be `z hello -- world arg`
echo: echo $@ # Shorthand command ('run' can be omitted').
echo.twice: # Multi commands can be used
- echo $@
- echo $@
echo.env.message: echo $MESSAGE # use env
echo.env.message2:
env: MESSAGE=message2 # task local default env
run: echo $MESSAGE
echo.var.value: echo {{value}} # use var
helloworld: z hello.world $@ # Alias to other task
default: npm.script
tasks:
npm.script: npm run