Bodega - An Invaluable Task Runner Known
Megabyte Labs
subheader_description
Table of Contents
* [Overview](#overview)
* [Features](#features)
* [Prompt](#prompt)
* [Initial Shell Script](#initial-shell-script)
- }A global shell_rc _ Hide tasks from being listed _ Initial Status _ Stop commands before execution _ Aliases _ More output messages _ Interactive Prompt _ Fancy listing _ [WIP] Progress bar
Overview
Bodega is a fork of go-task that adds powerful UX features and functional improvements while retaining backwards compatibility. For those of you who do not know, Task is a task runner / Make alternative written in Go. It allows you to define bash script snippets in YML files and provides some advanced features. Some of the features it includes is the ability to define dependencies, running tasks conditionally, caching values, and a built-in method of housing CLI documentation. Bodega takes go-task to the next level by improving the TUI experience and including features that allow you to use the project as a CLI-generator.
Features
Prompt
A prompt field provides an interactive method of getting user data.
In addition, it controls execution with the validate
sub-field
which, on correct input, executes the task answer
.
The user's selection (or input) is available as the .ANSWER template variable
test_prompt:
vars:
TEST: 'string'
prompt:
# available types:
# multiline, multi_select, select, password, confirm, input
type: input
message: What day is it?
# The options sub-field is used with propmpts of type select and multi_select
# options:
# - msg: Sunday
# - Tuesday
# The following is a dynamic option
# - msg:
# sh: date +%A
validate:
sh: '[[ ".ANSWER" == "Tuesday" ]]'
answer:
desc: 'a task executed on valid input only'
cmds:
- echo "successfully executing the answer task"
Initial Shell Script
The field shell_rc
is used to load common shell scripts or functions.
It can be specified both globally (on the Taskfile level) and locally
(on each individual task). Commands inside each task loads the
shell_rc
field before exeution.
version: '3'
<a href="#a-global-shell_rc" style="width:100%"><img style="width:100%" src="https://gitlab.com/megabyte-labs/assets/-/raw/master/png/aqua-divider.png" /></a>
# }A global shell_rc
shell_rc: |
func(){
echo "global function called!"
}
tasks:
init-script-global:
desc: Testing a local shell_rc field
cmds:
- echo "trying out the global shell_rc field"
- func
init-script:
desc: Testing a local shell_rc field
shell_rc: |
export VAR_INSIDE_INIT_SCRIPT="Hello from init script"
func(){
echo "local function called!"
}
cmds:
- echo "This is a var inside init_script $VAR_INSIDE_INIT_SCRIPT"
- func
- sleep 2 # doing some work
Hide tasks from being listed
The hide
field allows a task to not be listed with task --list
It can be also templated using Go templates
remember that Go is strongly typed. comparison must be done between equal types use double quotes for literals inside templates
error-with-hide:
desc: A hidden task that exits with an errors
vars:
CGO_ENABLED: 'true'
hide: '{{if eq .CGO_ENABLED "true"}} true else false end'
# hide: true
cmds:
- echo "text"
- exit 1
- echo "unreachable"
Initial Status
The initial_status
boolean field allows a task to be executed
once if the status
has been successfully executed once.
An initial_status
without a status
is simple ignored
tasks:
default:
cmds:
- generate-files
- rm -rf directory/
- generate-files
generate-files:
desc: Generate files diescription
cmds:
- mkdir directory
- touch directory/file1.txt
- touch directory/file2.txt
# test existence of files
status:
- test -d directory
- test -f directory/file1.txt
- test -f directory/file2.txt
initial_status: true
On running task default
from the command line, only the first execution of task generate-files
is done
Stop commands before execution
Passing the --debug
makes Task stop before each command execution, even for commands within a variable.
$ ./task --debug simple
task: [simple] echo 'hi'
Executing a shell command. Type enter to continue
hi
Aliases
From the command line, you may call a task by its alias instead of its name
echo-with-errors-ignored:
desc: Echoes a string but with errors ignored
# Try calling the task from the command line as `task hello`
alias: hello
cmds:
- cmd: exit 1
ignore_error: true
- echo "Hello World"
On the command line type task hello
to execute the task
More output messages
Running task
with more -v
s produces more verbose output
Option | Effect |
---|---|
-v |
Output each command executed, task running time |
-vv |
Output execution time of each command |
Interactive Prompt
Executing task
spawns a REPL-like shell by default. If you would like to execute the default task, please do task default
user@user:$ task
Type 'help' for a list of commands or 'quit' to exit
task> --list
Tasks
TASK │ ALIAS │ DESCRIPTION
───────────────────────────┼───────┼─────────────────────────────────
echo-with-errors-ignored │ hello │ Echoes a string but with
│ │ errors ignored
generate-files │ │ Generate files diescription
init-script │ │ Testing the new shell_rc field
simple │ │ A simple task with no extra
│ │ features
sleep │ │ zzzzzzz
test_prompt │ │ tests prompt
test_prompt_confirm │ │ test prompt confirm
test_prompt_password │ │ test prompt password
task> simple
task: [simple] echo "Hello"
Hello
task> sleep
task: [sleep] sleep "2"
task> ^D
readline error: EOF
user@user:$
Fancy listing
task --list
uses the list component from bubbletea
[WIP] Progress bar
Trach the issue here
Installation
There are several ways you can install this CLI. You can:
- Use our bash scripts which will handle everything automatically with as few dependencies as possible
- Compile the program using Go and add it to your
PATH
- Install it via an NPM convienience wrapper
- Download the pre-built binary from the GitLab or GitHub releases page and then place it in your
PATH
Quick Method
If you are looking to install the CLI as quickly as possible then you can run the following script which will install the binary to your /usr/local/bin
folder on macOS or Linux:
curl -sS https://install.doctor/task | bash
Or, if you are on Windows, you can install it by running:
Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://install.doctor/task?os=win'))
Compile Program with Go
You can install the CLI by compiling it from the source as long as you have a recent version of Go installed:
git clone https://github.com/ProfessorManhattan/Bodega.git
cd {{#withLast (split repository.github "/")}}this}}{{/withLast
.build_command
sudo mv ./dist/task /usr/local/bin
After you compile the program, you should then move the binary file to a location that is in your PATH
(which is what the last line does in the snippet above).
NPM Install Method
Every release is bundled into an NPM package that you can install by running the following command:
npm install -g task
Pre-Built Binary
If you trust us (and you should not.. trust.. anybody.. EVER), then you can also download the binary directly from the Bodega GitLab release page or the GitHub release page. After you download the release, you will have to either place the binary somewhere in your PATH
or run the installer (in the case of the .deb
or .rpm
releases, for instance).
Usage
All of the usage instructions can be found by running task --help
. After running the command, you should be greeted with the following output:
Usage: task [-ilfwvsd] [--init] [--list] [--force] [--watch] [--verbose] [--silent] [--dir] [--taskfile] [--dry] [--summary] [task...]
Runs the specified task(s). Falls back to the "default" task if no task name
was specified, or lists all tasks if an unknown task name was specified.
Example: 'task hello' with the following 'Taskfile.yml' file will generate an
'output.txt' file with the content "hello".
'''
version: '3'
tasks:
hello:
cmds:
- echo "I am going to write a file named 'output.txt' now."
- echo "hello" > output.txt
generates:
- output.txt
'''
Options:
-c, --color colored output. Enabled by default. Set flag to false or use NO_COLOR=1 to disable (default true)
-C, --concurrency int limit number tasks to run concurrently
-d, --dir string sets directory of execution
--dry compiles and prints tasks in the order that they would be run, without executing them
-f, --force forces execution even when the task is up-to-date
-h, --help shows Task usage
-i, --init creates a new Taskfile.yaml in the current folder
-l, --list lists tasks with description of current Taskfile
-a, --list-all lists tasks with or without a description
-o, --output string sets output style: [interleaved|group|prefixed]
-p, --parallel executes tasks provided on command line in parallel
-s, --silent disables echoing
--status exits with non-zero exit code if any of the given tasks is not up-to-date
--summary show summary about a task
-t, --taskfile string choose which Taskfile to run. Defaults to "Taskfile.yml"
-v, --verbose enables verbose mode
--version show Task version
-w, --watch enables watch of the given task
Man Page
Alternatively, if you installed the package via NPM or an installer that set up the man page (e.g. .deb
or .rpm
), then you can find usage instructions by running man task
.
Contributing
Contributions, issues, and feature requests are welcome! Feel free to check the issues page. If you would like to contribute, please take a look at the contributing guide.
Sponsorship
Dear Awesome Person,
I create open source projects out of love. Although I have a job, shelter, and as much fast food as I can handle, it would still be pretty cool to be appreciated by the community for something I have spent a lot of time and money on. Please consider sponsoring me! Who knows? Maybe I will be able to quit my job and publish open source full time.
Sincerely,
Brian Zalewski
License
Copyright © 2020-2021 Megabyte LLC. This project is MIT licensed.