GNU Make - программа для генерации программ из исходников. Изначально было заточено под C, но потом стали использовать и как файлик под скрипты.
Важно, что при вызове команды make
не учиывается переменная окружения SHELL
, а просто вызывается sh
.
Конфиг хранится в файле Makefile
.
Syntax
# задание опциональных аргументов
arg ?= "default"
Base
Команда, чтобы вывести другие команды плюс сразу напоминаем про .PHONY
:
.DEFAULT_GOAL := help
# Colors for terminal output
YELLOW := \033[33m
RESET := \033[0m
.PHONY: help
help : Makefile ## show list of available commands.
@echo "+--------------------+"
@echo "| AVAILABLE COMMANDS |"
@echo -e "+--------------------+\n"
@grep -E '^[a-zA-Z_-]+\s+?:.*?## .*$' $(MAKEFILE_LIST) | sort | awk 'BEGIN {FS = ":.*?## "}; {printf "$(YELLOW)make %-20s$(RESET) %s\n", $1, $2}'
Забираем environment из .env
если он есть:
ifneq (,$(wildcard ./.env))
include .env
export
endif
Python
Типичный файл для python:
- создать virtualenv
- установить зависимости из requirements.txt
- запустить приложение
- хорошее дополнение: генерация по pip-tools и разделе prod/dev
Шаблон:
SHELL:=/bin/bash
VENV_DIR=.venv
VENV_BIN=$(VENV_DIR)/bin
PYTHON=$(VENV_BIN)/python3
PIP=$(VENV_BIN)/pip3
## venv: create virtualenv
venv: $(VENV_DIR)
$(VENV_DIR):
python3 -m venv $(VENV_DIR)
## setup: init project - create virtualenv, install requirements
setup: venv pip
## pip-tools: generate requirements.txt and sync with virtualenv
pip-tools: venv requirements.in requirements-dev.in
$(PIP) install -U pip-tools
$(VENV_BIN)/pip-compile --generate-hashes --output-file=requirements.txt requirements.in
$(VENV_BIN)/pip-compile --generate-hashes --output-file=requirements-dev.txt requirements-dev.in
$(VENV_BIN)/pip-sync requirements.txt requirements-dev.txt
## pip: install requirements
pip: requirements.txt
$(PIP) install -r requirements.txt
$(PIP) install -r requirements-dev.txt
## run: run project
run: venv
$(PYTHON) src/app.py
## clean: clear python project (*.pyc, etc).
clean:
find . -name '*.pyc' -delete
find . -name '__pycache__' -type d | xargs rm -fr