VENV := .venv PYTHON := $(VENV)/bin/python PIP := $(VENV)/bin/pip WHEELS_DIR := wheels REQUIREMENTS := requirements.txt MAKECMDGOALS_TARGETS := install freeze wheels sync sync-offline clean help PKG := $(filter-out $(MAKECMDGOALS_TARGETS),$(MAKECMDGOALS)) .PHONY: install freeze wheels sync sync-offline clean help venv dj_makemigrations dj_migrate dj_superuser dj_run dj_test help: @echo "make install [ ...] - установить пакет(ы) в $(VENV), обновить $(REQUIREMENTS), собрать wheel в $(WHEELS_DIR)/" @echo "make sync - установить все пакеты из $(REQUIREMENTS) (из индекса)" @echo "make sync-offline - установить все пакеты из $(REQUIREMENTS) только из $(WHEELS_DIR)/, без обращения к индексу" @echo "make freeze - перезаписать $(REQUIREMENTS) текущим состоянием окружения" @echo "make wheels - собрать wheel для всех пакетов из $(REQUIREMENTS)" @echo "make clean - удалить $(WHEELS_DIR)/" venv: @test -d $(VENV) || python3 -m venv $(VENV) install: venv ifeq ($(strip $(PKG)),) $(error Укажите пакет: make install , например make install redis) endif echo $(PKG) $(PIP) install --upgrade $(PKG) $(PIP) freeze > $(REQUIREMENTS) @mkdir -p $(WHEELS_DIR) $(PIP) wheel $(PKG) -w $(WHEELS_DIR) @echo "Готово: $(PKG) установлен, $(REQUIREMENTS) обновлён, wheel-пакеты в $(WHEELS_DIR)/" sync: venv $(PIP) install -r $(REQUIREMENTS) sync-offline: venv $(PIP) install --no-index --find-links=$(WHEELS_DIR) -r $(REQUIREMENTS) freeze: venv $(PIP) freeze > $(REQUIREMENTS) wheels: venv @mkdir -p $(WHEELS_DIR) $(PIP) wheel -r $(REQUIREMENTS) -w $(WHEELS_DIR) clean: rm -rf $(WHEELS_DIR) # позволяет передавать имя пакета как аргумент: make install redis %: @: dj_makemigrations: cd src/ && ./manage.py makemigrations dj_migrate: cd src/ && ./manage.py migrate dj_superuser: cd src/ && ./manage.py createsuperuser dj_run: cd src/ && ./manage.py runserver dj_test: cd src/ && ./manage.py test dj_startapp: cd src/ && ./manage.py startapp $(app)