@mgutz/task
Version:
no configruation task runner
170 lines (126 loc) • 3.88 kB
Markdown
# task
`task` is a no configuration async task runner from plain es6 files
* .env support
* babel out of the box
* dependent tasks
* respawn daemons gracefully
* shell autocompletion
* watch
## Install
```sh
npm install -g @mgutz/task@next
```
## Running Tasks
Edit `Taskfile.js`. _Does not need to be inside a node project_
```js
export async function hello({argv}) {
console.log(`Hello, ${argv.name}!`)
}
```
Run `hello` task from terminal with a name
```sh
task hello --name world
```
Each task receives context with packages already used by `task`
| prop | desc |
| --------- | ------------------------------------------------ |
| \_ | [lodash](https://lodash.com/docs) |
| _argv_ | [minimist](https://github.com/substack/minimist) |
| _contrib_ | contrib functions _{shawn}_ |
| _event_ | Watch event |
| _glob_ | [globby](https://github.com/sindresorhus/globby) |
| _sh_ | [shelljs](http://documentup.com/shelljs/shelljs) |
## Export Meta for More Options
```js
export function build() {}
export function clean() {}
export function generate() {}
export default {
build: {desc: 'builds project', deps: [clean, generate]},
}
```
Alternatively,
```js
export default {
build: {desc: 'builds project', run: () => {}, deps: ['clean', 'generate']},
clean: {desc: 'cleans project', run: () => {}},
generate: {desc: 'generates code', run: () => {}},
}
```
Metadata props
| prop | desc |
| ------- | -------------------------------------------------------------------- |
| _deps_ | Functions which must run before task |
| _desc_ | Description to display in task list |
| _once_ | Task must only run once |
| _run_ | The function to run. May be ignored if key is exported function name |
| _watch_ | [Glob](https://github.com/micromatch/anymatch) patterns to watch |
## Set a Default Task
```js
export default build
```
Or create a pseudo-task named default
```js
export default {
default: {deps: [build]},
}
```
## Watch Tasks
Watching requires defining glob patterns for a task
```js
export default {
build: {
watch: ['src/**/*.js'],
},
}
```
Run a task in watch mode with `--watch, -w` flag
```sh
task build -w
```
NOTE: `task` can gracefully restart a process (and subprocesses) if a task returns a
[ChildProcess](https://nodejs.org/api/child_process.html#child_process_class_childprocess).
`task` provides `contrib.shawn` to run a literal script and return a `ChildProcess`
To properly restart a go http server listening on a port whenever a go file
changes
```js
export function server({contrib}) {
return contrib.shawn(`
cd cmd/server
go install
server
`)
}
export default {
server: {watch: ['server/**/*.go']},
}
```
```sh
task server -w
```
## Running Multiple Tasks
`task` only runs a single task to be consistent with args. To run multiple tasks,
call them directly within a task or add tasks to `deps` prop.
## contrib.shawn
`shawn` is short for shell spawn. `shawn` executes `/bin/bash -c [script]` by
default. The shell and arguments can be overriden
```js
export function server({contrib}) {
// shawn accepts any child_process.spawn option
return contrib.shawn(`node index.js`, {
shell: '/bin/bash',
shellArgs: ['-c'],
env: process.env,
})
}
```
## Auto Completion
Shell auto completion requires editing your shell's rc files. The easiest
solution is by running
```sh
task --setup-completion
```
If you want more control, read [omelette](https://github.com/f/omelette#manual-install)
to manually integrate autocompletion.
## LICENSE
MIT