Справді! Чому б не використати потужну та виразну мову для проблеми, яка є більш складною, ніж часто (спочатку) думають люди? Особливо, коли люди, які стикаються з проблемою, вже володіють такою мовою. (Побудова - це власна проблема програмістів і найкраще вирішується програмістами.)
Я також задав собі це питання років тому і вирішив, що 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 .
Фактично, порівняйте це з деякими нібито декларативними системами побудови, які піддають своїх користувачів таким імперативним дієсловам, як "тест" або "компілювати". Вищенаведена декларація містить лише іменники, не дієслова. Складання та тестування - це завдання, які iwant неявно обробляє, щоб надати користувачеві іменники, які він хоче. Це не мова. Це як ви цим користуєтеся.
"Java є багатослівною"
Так, багато коду Java там є багатослівним. Але знову ж таки, це не мова, а те, як ви її використовуєте. Якщо реалізація є багатослівною, просто інкапсулюйте її за приємною абстракцією. Багато GPL надають адекватні механізми для цього.
Просто уявіть наведений вище фрагмент Java, написаний у XML. Замініть дужки на кутові дужки та перемістіть їх. А потім дублюйте кожне ключове слово як завершальний тег! Java як синтаксис не є багатослівним.
(Я знаю, порівнювати з XML - це як брати цукерки у дитини, але так багато складених випадків визначаються в XML.)
"Вам доведеться скласти сценарій збірки"
Це дійсний пункт. Тим не менше, це лише незначна технічна проблема, яку потрібно вирішити. Я міг би вирішити це, використовуючи бобше або інший перекладач. Натомість я вирішив це, розглядаючи його як лише чергову проблему збірки та завантажуючи iwant за допомогою простого сценарію оболонки чи мурашника, який компілює та запускає простий завантажувач Java.
"У Java є котлован"
Правда. Ви повинні імпортувати класи, ви повинні згадати "public", "class" тощо. І ось прості зовнішні DSL отримують початковий простий виграш.
І якщо ваш проект настільки банальний, що ця котяча панель є важливою, вітаю. Ваша проблема не є складною, і насправді не має значення, як ви її вирішите.
Але для багатьох проектів потрібно набагато більше, ніж складання, звіт про покриття та упаковка. Якщо котлован Java прийнятний для клієнтів, чому б не створити проблеми? Навіщо робити взуття тільки для чужих дітей?