Верно! Почему бы не использовать мощный и выразительный язык для более сложной проблемы, чем думают люди (изначально)? Особенно, когда люди, сталкивающиеся с проблемой, уже владеют таким языком. (Сборка - это собственная проблема программистов, которую лучше всего решать программистам.)
Я также задавал себе этот вопрос несколько лет назад и решил, что Java - хороший язык для определения сборок, особенно для проектов Java. И в результате я начал что-то делать с этим.
ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ : В этом ответе я продвигаю iwant , систему сборки, которую разрабатываю. Но так как это в любом случае самоуверенное обсуждение, я уверен, что все в порядке.
Я не буду подробно останавливаться на преимуществах Java (мощь и выразительность) или на iwant. Если вы заинтересованы, вы можете прочитать больше на странице iwant .
Вместо этого я рассмотрю, почему Java (и другие GPL) так легко отклоняются как непригодные для сборки. Многие ответы и комментарии здесь являются хорошими примерами такого мышления. Давайте рассмотрим некоторые типичные аргументы:
«Java обязательна, но сборки лучше всего определять декларативным способом» , - говорят они.
Правда. Но при использовании языка в качестве метаязыка для внутреннего DSL на самом деле важен его синтаксис . Даже такой императивный язык, как Java, может быть обманут, чтобы быть декларативным. Если это выглядит и кажется декларативным, это (для практических целей) декларативно. Например:
JacocoTargetsOfJavaModules.with()
.jacocoWithDeps(jacoco(), modules.asmAll.mainArtifact())
.antJars(TestedIwantDependencies.antJar(),
TestedIwantDependencies.antLauncherJar())
.modules(interestingModules).end().jacocoReport(name)
Это реальный пример из демонстрационного проекта iwant .
Фактически, сравните это с некоторыми якобы декларативными системами сборки, которые предоставляют своим пользователям такие обязательные глаголы, как «test» или «compile». Вышеуказанная декларация содержит только существительные, без глаголов. Компиляция и тестирование - это задачи, неявно выполняемые iwant для предоставления пользователю существительных, которые он / она хочет. Это не язык. Это то, как вы используете это.
"Ява многословна"
Да, много Java-кода там многословно. Но опять же, это не язык, а то, как вы его используете. Если реализация многословна, просто заключите ее в красивую абстракцию. Многие GPL предоставляют адекватные механизмы для этого.
Просто представьте приведенный выше фрагмент кода Java, написанный на XML. Замените скобки угловыми скобками и переместите их. А затем продублируйте каждое ключевое слово как закрывающий тег! Java , как синтаксис является не многословен.
(Я знаю, что сравнивать с XML - это все равно, что отнимать конфеты у ребенка, но так много сборок просто определено в XML.)
«Вы должны скомпилировать свой скрипт сборки»
Это верный момент. Тем не менее, это просто небольшая техническая проблема, которую нужно решить. Я мог бы решить это с помощью бобов или другого интерпретатора. Вместо этого я решил эту проблему, рассматривая ее как еще одну проблему сборки и загружая iwant с помощью простого сценария оболочки или муравья, который компилирует и запускает простой загрузчик Java.
"Ява имеет образец"
Правда. Вы должны импортировать классы, вы должны упомянуть «public», «class» и так далее. А вот простые внешние DSL дают начальный легкий выигрыш.
И если ваш проект настолько тривиален, что этот шаблон является значительным, поздравляю. Ваша проблема не сложная, и на самом деле не имеет значения, как вы ее решаете.
Но многим проектам нужно гораздо больше, чем компиляция, отчет о покрытии и упаковка. Если шаблон Java является приемлемым для проблем клиентов, почему бы не построить проблемы? Зачем делать обувь только для чужих детей?