Tatsächlich! Warum nicht eine mächtige und ausdrucksstarke Sprache für ein Problem verwenden, das komplexer ist, als die Leute (anfangs) oft denken? Vor allem, wenn die Betroffenen bereits mit einer solchen Sprache vertraut sind. (Bauen ist das Problem der Programmierer und wird am besten von den Programmierern gelöst.)
Diese Frage habe ich mir auch vor Jahren gestellt und festgestellt, dass Java eine gute Sprache für die Definition von Builds ist, insbesondere für Java-Projekte. Infolgedessen fing ich an, etwas dagegen zu unternehmen.
HAFTUNGSAUSSCHLUSS : In dieser Antwort bewerbe ich iwant , ein Build-System, das ich entwickle. Aber da dies sowieso eine Diskussion mit einer Meinung ist, bin ich mir sicher, dass es in Ordnung ist.
Auf die Vorteile von Java (Leistung und Ausdruckskraft) werde ich nicht näher eingehen. Wenn Sie interessiert sind, können Sie mehr auf der iwant Seite lesen .
Stattdessen werde ich überlegen, warum Java (und andere GPLs) so schnell als ungeeignet für das Bauen abgetan werden. Viele Antworten und Kommentare hier sind gute Beispiele für ein solches Denken. Betrachten wir einige der typischen Argumente:
"Java ist ein Muss, aber Builds lassen sich am besten deklarativ definieren" , könnten sie sagen.
Wahr. Bei der Verwendung einer Sprache als Metasprache für ein internes DSL zählt jedoch die Syntax . Selbst eine imperative Sprache wie Java kann ausgetrickst werden , um deklarativ zu sein. Wenn es deklarativ aussieht und sich deklarativ anfühlt, ist es (aus praktischen Gründen) deklarativ. Beispielsweise:
JacocoTargetsOfJavaModules.with()
.jacocoWithDeps(jacoco(), modules.asmAll.mainArtifact())
.antJars(TestedIwantDependencies.antJar(),
TestedIwantDependencies.antLauncherJar())
.modules(interestingModules).end().jacocoReport(name)
Dies ist ein echtes Beispiel aus dem Demo-Projekt von iwant .
Vergleichen Sie dies tatsächlich mit einigen vermeintlich deklarativen Buildsystemen, die ihre Benutzer solchen Imperativverben wie "test" oder "compile" aussetzen. Die obige Deklaration enthält nur Substantive, keine Verben. Kompilieren und Testen sind Aufgaben, die von iwant implizit ausgeführt werden, um dem Benutzer die gewünschten Substantive zuzuweisen. Es ist nicht die Sprache. So benutzt du es.
"Java ist wortreich"
Ja, viel Java-Code ist ausführlich. Aber es ist nicht die Sprache, sondern die Art und Weise, wie Sie sie verwenden. Wenn eine Implementierung ausführlich ist, kapseln Sie sie einfach hinter einer netten Abstraktion. Viele GPLs bieten hierfür angemessene Mechanismen.
Stellen Sie sich das obige Java-Snippet vor, das in XML geschrieben ist. Ersetzen Sie Klammern durch spitze Klammern und verschieben Sie sie. Und dann duplizieren Sie jedes Keyword als Abschluss-Tag! Java als Syntax ist nicht ausführlich.
(Ich weiß, ein Vergleich mit XML ist, als würde man einem Baby Süßigkeiten abnehmen, aber so viele Builds werden zufällig in XML definiert.)
"Sie müssten Ihr Build-Skript kompilieren"
Dies ist ein gültiger Punkt. Trotzdem ist es nur ein kleines technisches Problem, das gelöst werden muss. Ich hätte es mit einer Bohnenschale oder einem anderen Interpreter lösen können . Stattdessen habe ich es gelöst, indem ich es als ein weiteres Build-Problem behandelt und mit einer einfachen Shell oder einem Ant-Skript gebootet habe, das einen einfachen Java-Bootstrapper kompiliert und ausführt.
"Java hat Boilerplate"
Wahr. Sie müssen Klassen importieren, Sie müssen "public", "class" und so weiter erwähnen. Und hier erzielen einfache externe DSLs einen anfänglichen leichten Gewinn.
Und wenn Ihr Projekt so trivial ist, dass dieses Boilerplate von Bedeutung ist, herzlichen Glückwunsch. Ihr Problem ist nicht schwierig und es spielt keine Rolle, wie Sie es lösen.
Viele Projekte erfordern jedoch viel mehr als die Erstellung, Berichterstattung und Verpackung. Wenn das Boilerplate von Java für Kundenprobleme akzeptabel ist, warum keine Probleme erstellen? Warum Schuhe nur für Kinder anderer machen?