./task
Run any project.
The task file is a simple bash script and standardized interface for all software projects.
It is to be understood as a software development pattern to standardize the installation, configuration and execution of different software frameworks.
# Specification
The specification is a short guide to set up a task file for a Python project.
Create a file task in your project.
touch task
Ensure it is executable.
chmod +x task
First add the bash shebang.
#!/usr/bin/env bash
Then append the abort on error setting.
set -e
Load environment variables from the .env file.
if [[ -a ".env" ]]; then
source .env
fi
Add a help function.
help-table() {
local cmd_width=10
local opt_width=6
local desc_width=40
local column="| %-${cmd_width}s | %-${opt_width}s | %-${desc_width}s |\n"
printf "$column" "Command" "Option" "Description"
echo "|$(printf '%*s' $((cmd_width + 2)) '' | tr ' ' '-')|$(printf '%*s' $((opt_width + 2)) '' | tr ' ' '-')|$(printf '%*s' $((desc_width + 2)) '' | tr ' ' '-')|"
printf "$column" "help" "[grep]" "Show help for commands."
printf "$column" "install" "" "Setup the local environment."
printf "$column" "lint" "" "Run pre-commit and update index.html."
printf "$column" "version" "" "Show version of required tools."
}
help() {
echo
if [[ -n "$1" ]]; then
help-table | grep -i "$1" | column -t -s'|'
else
echo "task <command> [options]"
echo
echo "commands:"
echo
help-table
fi
echo
}
Setup the command functions.
version() {
uv --version
}
install() {
echo "Setup venv and install python dependencies"
uv venv env
source env/bin/activate
uv pip install pre-commit
}
lint() {
source env/bin/activate
echo "Run pre-commit"
pre-commit run --all-file
}
Finish the task file with command switch cases.
if declare -f "$1" > /dev/null; then
"$1" "${@:2}"
else
case "$1" in
all)
install
lint
;;
*)
echo "Unknown command: $1"
help
exit 1
;;
esac
fi
These are the main parts of every task file script.
Now see usage on how to use the task file.
# Naming
The naming of functions is important. There are basically two styles:
- Action + Object
- Object + Action
The task file functions use the first style. The name of the function starts with an action followed by an object. The object name can be singular or plural.
Examples for actions: activate, install, dev, develop, init, build, start, update, remove, delete, enable, disable, template, convert, create, edit, change, get, set, patch, fetch, generate, push, pull, import, export, list, publish, release, test, setup, prepare, restart, stop, store, restore, translate, upgrade, zip, visualize, sync, switch, run, reset, load, dump, checkout, commit, drop, deploy, handle, trigger, render, lint, uninstall, split, parse, fix, refactor, transform, cat, ls, rm, serve, help, show, filter, login, logout, encrypt, decrypt, upload, download, analyse, transpile, compile, minify, copy
Examples for objects: env, venv, submodule, container, database, snippet, model, module, repo, mail, doc, dependency, view, user, vault, file, host, node, log, password, hash, script, requirement, part, component, system, workspace, image, process, state, platform, dir, folder, readme, overview, lang, level, request, response, result, worker, server, proxy, workflow, volume, network, package, field, value, secret, chart, node, edge, function, method, firewall, html, css, image, svg, style, query, native, group, notebook
Objects can be tools: odoo, vupress, nodejs, zsh, bash, fish, podman, kind, minikube, helm, nvim, docker, podman, rust, python, tmux, vim, helix, system, git, pass, llm, sql, dotenv, javascript, vue, vite, astro, typescript, turbo, pnpm, eslint, jenkins, k8s, nextcloud, postgres, metabase, ansible, prometheus, grafana, hugo, deno, bun, babel, panda, gulp, grunt, electron, react, express, mongodb, angular, ionic, meteor, webpack, bower, jupyter
# Style
The bash scripts follow the Bash Style Guide | ysap.sh. Have a look at the AGENTS.md for details on the applied styling.