$ bake — the strangely familiar task–runner.
## What's in the oven? - A `Bakefile`, which looks and feels like the good parts of a `Makefile`. - Except, you can write real `bash` code! Any and all syntax is accepted — no magic going on here. - Unlike a `Makefile`, you can use `\t` ` ` (*i.e.* `4×' '`). - Environment variables are explicitly passed or whitelisted (allowed), not inherited from the parent shell. - Tasks can be run safely and reliably. Rest assured that scripts are executed from the project root directory. - There are many other benefits to this design, that have yet to be expressed in this document. ------------------ ### Automate Workflows — Bootstrap Development Environments — Commit The Tasks I love using `Makefile` for one-off **tasks** in projects. The problem with doing this is that you can't use familiar bash–isms when doing so, as **GNU Make** doesn't use the familiar **Bash** syntax, nor does it allow for simple ad–hoc use of arbitrary scripting languages (e.g. **Python**). This project seeks to bridge all of these worlds into a single entrypoint — ideal for cross–language repositories ------------------- ## Bootstraping `bake`, locally #### **Various `*`nix Distributions** (Python 3.6+): The primary installation method of `bake`, today, is via `pip`: ```console $ pip3 install bake-cli Collecting bake-cli … Successfully installed bake-cli-0.2.0 delegator.py-0.1.1 pexpect-4.7.0 ptyprocess-0.6.0 ``` This will always work, but it will not be the default recommendation. #### MacOS (Previously known as OS X) Installation of `bake` will (soon) be very easy, with Homebrew. The formula needs a subtle adjustment — if you want to help, [here's the repo](http://github.com/kennethreitz/homebrew--)! ```console $ brew install kennethreitz/-/bake ==> Installing bake from kennethreitz/- … 🍺 /usr/local/Cellar/bake/19-09-16: 1,563 files, 16.7MB, built in 11 seconds ``` Homebrew will be the primary installation target of `bake`. ✨🍰✨ #### Containers! *e.g.* Docker. You an also run `bake` via Docker! An official image has been made available: ```console $ docker run kennethreitz/bake Wed Sep 18 10:11:01 2019 No Bakefile found! Usage: [OPTIONS] [TASK] [ARGUMENTS]... $ bake — the strangely familiar task–runner. Options: -b, --bakefile PATH The Bakefile to use. -l, --list Lists available tasks (and their dependencies). -h, --help Show this message and exit. --shellcheck Run shellcheck on Bakefile. --allow TEXT Whitelist an environment variable for use. --no-deps Do not run dependent tasks. --yes Set medium–security prompts to yes. --continue Continue, if a task fails. -i, --interactive Run in interactive mode. --insecure Inherit parent shell's environment variables. -s, --silent Reduce output. -e, --environ-json TEXT Provide environment variables via JSON. -j, --json Output in JSON format (stdout). ``` --------------- ### Community / Contrib - [Visual Studio Code Extension](https://marketplace.visualstudio.com/items?itemName=kennethreitz.bake) — highlights `Bakefile`— adequately. ### Team & Workflow Management ```console $ bake install + Executing install/node: | yarn install v1.17.3 | info No lockfile found. | [1/4] Resolving packages... | [2/4] Fetching packages... | [3/4] Linking dependencies... | [4/4] Building fresh packages... | success Saved lockfile. | Done in 0.05s. + Executing install/python: | Installing dependencies from Pipfile.lock (f10bb0)… + Executing install: + Done. ``` ### Skip Steps, Automatically Because we configured `yarn.lock` and `Pipfile.lock` as cache keys, bake will automatically skip the configured steps— only running them when the files are changed! So, let's run that command again :) ```console $ bake install + Skipping install/node: + Skipping install/python. + Executing install: + Done. ``` Neat, eh? ### Passing Values (Arguments & Parameters) ```console $ bake utils/argv KEY=VALUE 1 2 3 + Executing utils/argv: | WORLD: 1 2 3 + Done. ``` ### Added Peace of Mind ```console $ bake utils/deploy What is 10 times 2?: 7 Aborted. ``` ---------------------$ cat Bakefile $ bake install install: install/node install/python + Executing install/node: echo 'All ready!' | yarn install v1.17.3 install/full: install/system install | info No lockfile found. install/python: @skip:key=Pipfile.lock | [1/4] Resolving packages... pipenv install | [2/4] Fetching packages... install/node: @skip:key=yarn.lock | [3/4] Linking dependencies... yarn install | [4/4] Building fresh packages... install/system: @confirm | success Saved lockfile. brew install pipenv yarn | Done in 0.05s. + Executing install/python: python/format: | Installing dependencies from … black . + Executing install: | All ready! utils/argv: + Done. set -u && echo "$HELLO: $@" Rinse and repeat… utils/deploy: @confirm:secure exit 0
This software has been designed for you, with much joy, by Kenneth Reitz.