Makefile в Docker
Makefile
это файл, который хранится вместе с кодом в репозитории. Его обычно помещают в корень проекта. Он выступает и как документация, и как исполняемый код. Мейкфайл скрывает за собой детали реализации и раскладывает по полочкам команды, а утилита make
запускает их из того мейкфайла, который находится в текущей директории.
Синтаксис Makefile
Команда make
запускает цели из Makefile
, которые состоят из команд:
Makefile# имя цели, поддерживается kebab-case и snake_case
цель1:
# для отступа используется табуляция, команды будут выполняться последовательно и только в случае успеха предыдущей
команда1
команда2
Недостаточно просто начать использовать мейкфайл в проекте. Чтобы получить эффект от его внедрения, понадобится поработать над разделением команд на цели, а целям дать семантически подходящие имена, вот пример правильного файла:
Makefile# создать .env-файл для секретов
env-prepare:
cp -n .env.example .env
# подготовить локальную БД
sqlite-prepare:
touch database/database.sqlite
# установить зависимости
install:
composer install
npm install
# сгенерировать ключи
key:
php artisan key:generate
# загрузить данные в БД
db-prepare:
php artisan migrate --seed
# запустить приложение
start:
heroku local -f Procfile.dev
Зависимости Makefile
Когда команды разбиты на цели, можно отдельно установить зависимости командой make install
. Остальные цели нужны только при первом разворачивании проекта и выполнять их нужно в определённой последовательности. Говоря языком мейкфайла, цель имеет пререквизиты:
Makefile# такой синтаксис указывает на зависимость задач — цель1 зависит от цель2
цель1: цель2
# команда2 выполнится только в случае успеха команды из цель2
команда2
цель2:
команда1
Задачи будут выполняться только в указанной последовательности и только в случае успеха предыдущей задачи. Значит, можно добавить цель setup
, чтобы объединить в себе все необходимые действия:
Makefile# можно ссылаться на цели, описанные ниже
setup: env-prepare sqlite-prepare install key db-prepare
env-prepare:
cp -n .env.example .env
sqlite-prepare:
touch database/database.sqlite
install:
composer install
npm install
key:
php artisan key:generate
db-prepare:
php artisan migrate --seed
start:
heroku local -f Procfile.dev
Запуск Makefile
Запустить make
в текущей директории:
Bashmake
Запустить make
в текущей директории и обратиться к конкретной цели:
Bashmake setup # выполнит последовательно: env-prepare sqlite-prepare install key db-prepare
Благодаря проделанной работе Makefile
, команды проекта вместе с флагами сведены в Makefile
. Он обеспечивает правильный порядок выполнения и не важно, какие при этом задействованы языки и технологии.
Специальные цели
В большинстве make-файлов можно найти цели, называемые специальными. Вот самые распространенные:
all
собрать весь проект целикомclean
удалить все сгенерированные артефактыinstall
установить сгенерированные файлы в системуrelease
илиdist
для подготовки дистрибутивов (модули и тарболы)