Skip to content

Bake — the strangely familiar workflow utility.

License

Notifications You must be signed in to change notification settings

kennethreitz/bake

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

bake— the strangely familiar task runner.

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 abritrary scripting languages (e.g. Python).

This project seeks to bridge all of these worlds into a single entrypoint — ideal for cross–language repositories.

vanity image


$ bake -h
Usage: bake [OPTIONS] [TASK] [ARGUMENTS]...

  bake — the strangely familiar task–runner.

Options:
  -b, --bakefile PATH      The Bakefile to use.
  -l, --list               Lists available tasks.
  --allow TEXT             Whitelist an environment variable for use.
  --yes                    Set medium–security prompts to yes.
  -c, --continue           Continue, if a task fails.
  --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).
  -h, --help               Show this message and exit.

Features 'n Things

  • A Bakefile, which looks and feels like the good parts of a Makefile.
  • Except, you can write real bash code!
  • Environment variables are explicitly passed or whitelisted (allowed), not inherinted from the parent shell.
  • Unlike Makefile, either tabs or 4 spaces can be used.
  • Tasks can be run safely and reliably. Rest assured that scripts are executed from the project root (e.g. location of the Bakefile).
  • See advanced example for further, juicy, details.

Installing $ bake

MacOS:

$ brew install kennethreitz/-/bake
==> Installing bake from kennethreitz/-

🍺  /usr/local/Cellar/bake/19-09-16: 1,563 files, 16.7MB, built in 11 seconds

Various Linux Distributions (Python 3.6+):

$ 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

✨🍰✨


$ cat Bakefile

full-install: system-deps install
install: node-deps python-deps
format:
    black .

python-deps:
    pipenv install
node-deps:
    yarn install
system-deps: @confirm
    brew install pipenv
    
python-example:
    #!/usr/bin/env python
    import os
    import sys

    print(os.environ['KEY'])
    print(sys.argv[1:])

dangerous-example: @confirm:secure
    # <insert deploy to production here>
    exit 0

$ bake install

 + Executing 'node-deps':
yarn install v1.17.3
[1/4] 🔍  Resolving packages...
success Already up-to-date.
✨  Done in 0.03s.
 + Executing 'python-deps':
Installing dependencies from Pipfile.lock (2ee04c)…
  🐍   ▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉ 8/8 — 00:00:01
 + Done.

$ bake python-example KEY=VALUE 1 2 3

 + Executing 'python-argv':
   VALUE
   ['1', '2', '3']
 + Done.

$ bake dangerous-example

+ Executing '@confirm:secure' ·
   What is 10 times 2?: 7
Aborted.

Advanced Usage Sample

advanced screenshot

Fancy, eh?


This repository has been brought to you, with much joy, by Kenneth Reitz.

kr soul icon

As above, so below.