Здравствуйте, vsb, Вы писали:
vsb>Makefile это гибрид. Декларативно описываются цели сборки и их зависимости. В то же время сами инструкции для сборки описываются императивно.
Эта императивная часть просто для удобства, она не критична, она даже не часть мейк-языка, она может писаться на абсолютно любом языке — на питоне, на перле... Если бы они требовали укладываться в одну строчку и чтоб все команды были внешними — было бы лучше? Это просто способ объявить скрипт прямо внутри, не вынося его наружу в отдельный файл.
vsb>На мой взгляд основная проблема Makefile-ов в их плохой расширяемости и реюзабельности.
Расширяемости? А с ней-то что не так? Куда уж расширябельнее? правила в свободной форме, команды зови какие хочешь, они вообще не на языке мейка написаны, а на языке шелла, который ты используешь, можешь использовать хоть перл.
vsb>Сложно скопипастить в произвольный Makefile откуда-нибудь простую строчку, чтобы в твоём проекте начались конкатенироваться и сжиматься JS-файлы. Нужно очень хорошо понимать, как это всё работает.
ну мало в каком языке ты можешь взять выдрать произвольный кусок кода, воткнуть его в произвольлное место в своем коде, и чтоб все заработало. Всегда оно за собой еще что-то потянет — импорты, определения, конфигурационные переменные и т.п.
В противовес, например, maven-у, который решает множество задач путём простой копипасты из инструкции, им пользуются куча людей, которые не особенно понимают, как он работает. Поэтому он и стал таким популярным.
Ну да, Convention over Configuration в чистом виде. Все должно быть прибито гвоздями, все ходите строем с левой ноги и любите XML. Зато можно копипастить. (А в идеале — даже открывать его не надо: если все делать по стандарту, то все будет работать из коробки). В конце концов, файл мавена — это же просто файл конфига, а их обычно можно копипастить достаточно свободно. Это не свободные правила в свободном виде, как там, я не знаю, в Прологе.
vsb>Никто не хочет тратить время на изучение второстепенного инструмента.
Любой инструмент, которым ты овладел, становится нормальным инструментом, а не второстепенным — ты знаешь его сильные и слабые стороны и можешь применить с пользой для себя там, где он подходит лучше всего.
И мейк лучше всего подходит там, где надо что-то автоматом сделать с одними файлами, если изменились указанные файлы-зависимости.
Банальный пример — лог с прогоном теста зависит от тестового бинарника (или скрипта, или что ты там тестируешь) и от файлов с тестовыми данными. Если что-то из этого списка изменилось — мейк автоматом прогонит тест. (При этом тестовые данные сами тоже могут генериться из чего-нть, например, XML->CSV или CSV->binary.)
Это хороший гибкий инструмент со своей достаточно широко очерченной областью применения. А мавен — просто конфиг с одной единственной заточкой под сборку проектов.
ЗЫ Ну, то есть, я предполагаю, что на мавене тоже можно что-то серьезное кастомизированное написать, но не думаю, что в таком случае писанине будет меньше, чем с мейком. А, скорее всего, сильно больше — потому что мейк и уже очень минималистичен синтаксически.