0005 — Makefile

Увидел в твиторе весьма популярное мнение, что Makefile — устаревшая технология, нужная только замшелым дедам, которые не могут идти в ногу со временем и пользуются этим говном мамонта только по той причине, что не способны освоить ничего нового.

Теперь я выскажу своё мнение. А чё вы мне сделаете? Я в другом городе!

Было время, когда сайты делались «по-колхозному»: вот тут у нас таблицы стилей, вот тут скрипты, а это миграции для БД. Обычно такая структура выглядела так:

site
└─static
  ├─js/
  │ ├─bootstrap.min.js
  │ └─jquery.min.js
  └─css
    ├─bootstrap-theme.min.css
    ├─bootstrap.min.css
    └─custom.css

И этого хватало для 95% сайтов. Надо ли говорить, что даже на мобильниках, умеющих только в 3G, всё это загружалось довольно быстро и нормально работало? Не верите?

Потом какой-то мудак придумал Web-приложения. Суть такова: мы сейчас напишем кучу говна, оно потом специальными скриптами соберётся из нескольких файлов, и на странице будут подключены:

  • один единственный файл styles.css, в котором будут в уже сжатом виде все слепленные вместе таблицы стилей;
  • один единственный файл app.js, в котором будут в сжатом виде все скрипты, нужные для работы страницы.

Надо ли говорить, что кешируется всё это очень плохо?

Ну ладно, я сейчас не буду ныть, что раньше трава была зеленее, а небо голубее.

Всё это дело надо было как-то собирать. И фронтэндеры притащили на десктоп вещь из мира Web — NodeJS. Это такой JavaScript, как в браузере, только не нужный.

Сначала, по-моему, был такой сборщик Grunt.

Но он не долго продержался. Его довольно быстро, в течение 2—3 лет (по фронтэндерским меркам — целая вечность) заменил Gulp, который был вроде бы удобен, но только на фоне других существовавших средств.

И тут на сцену выходит WebPack. Стильно! Модно! Молодёжно!

А если проект не собирается, нужно всего лишь:

rm -rf ./node_modules/ && npm install

Я не шучу. Если опять не получилось, повторить несколько раз.

Хочется спросить: а какого хрена?

Ответ: в мире разработчиков переднего конца так принято. Потому что твоё приложение на 300 строк требует для сборки и запуска тысячи зависимостей, написанных какими-то чертями из интернета.

Ещё, кстати, появились шутки на тему квалификации разработчиков: умеет настраивать сборку через WebPack — гуру. Потому что WebPack очень быстро стал вещью в себе. Его настройка иногда сложнее, чем приложение, которое он должен собирать. Надо ли говорить про обратную совместимость? Сколько раз смена минорной версии полностью ломала сборку?

А что не так с Makefile?

Да всё с ним так. Для запуска нужно присутствие в системе утилиты make. Сам по себе Makefile — простой как две копейки текстовый файл, в котором есть переменные и список команд.

Как запустить? Перейти в каталог с этим файлом и выполнить команду:

make

По-умолчанию запускается первая цель.

Если нужно выполнить другую задачу, надо передать её имя. Также можно собрать их в цепочку:

make && make install clean

Например, вот так выглядит Makefile, который собирает этот сайт:

CC=hugo
USER=<имя пользователя>
HOST=<хост для выкладки>
FOLDER=<целевой каталог на хостинге>

build:
	$(CC)

server:
	$(CC) server \
		--buildDrafts \
		--watch

deploy:
	$(CC) \
		--minify \
	&& scp -rp ./public/* $(USER)@$(HOST):$(FOLDER)

Для выгрузки готового сайта на хостинг я делаю так:

make deploy

Особенности:

  1. Между именем переменной, знаком = и значением не должно быть пробелов.
  2. Для отступов надо использовать табуляцию.
  3. По традиции имя компилятора хранится в переменной CC.

В общем, проверенная годами технология, настоятельно рекомендую. Хороший ресурс для базового знакомства здесь.