Effectivement! Pourquoi ne pas utiliser un puissant et expressif langage pour un problème plus complexe qu'on ne le pense souvent (au départ)? Surtout quand les personnes confrontées au problème sont déjà compétentes avec une telle langue. (La construction est le problème des programmeurs et est le mieux résolu par les programmeurs.)
Je me suis aussi posé cette question il y a des années et j'ai décidé que Java est un bon langage pour définir des builds, en particulier pour des projets Java. Et, en conséquence, j'ai commencé à faire quelque chose à ce sujet.
AVERTISSEMENT : Dans cette réponse, je fais la promotion d' iwant , un système de build que je développe. Mais comme il s'agit de toute façon d'une discussion d'opinion, je suis sûr que ça va.
Je ne m'étendrai pas sur les avantages de Java (puissance et expressivité) ou iwant en particulier. Si vous êtes intéressé, vous pouvez en lire plus sur la page iwant .
Au lieu de cela, je considérerai pourquoi Java (et d'autres GPL) est si facilement rejeté comme impropre à la construction. De nombreuses réponses et commentaires sont de bons exemples d'une telle réflexion. Examinons certains des arguments typiques:
"Java est impératif, mais les builds sont mieux définis de manière déclarative" , pourraient-ils dire.
Vrai. Mais lorsque vous utilisez un langage comme métalangage pour une DSL interne , ce qui compte vraiment, c'est sa syntaxe . Même un langage impératif comme Java peut être trompé pour être déclaratif. S'il semble et se sent déclaratif, il est (à des fins pratiques) déclaratif. Par exemple:
JacocoTargetsOfJavaModules.with()
.jacocoWithDeps(jacoco(), modules.asmAll.mainArtifact())
.antJars(TestedIwantDependencies.antJar(),
TestedIwantDependencies.antLauncherJar())
.modules(interestingModules).end().jacocoReport(name)
Ceci est un véritable exemple du projet de démonstration d'iwant .
En fait, comparez cela à certains systèmes de construction soi-disant déclaratifs qui exposent leurs utilisateurs à des verbes impératifs tels que "tester" ou "compiler". La déclaration ci-dessus ne contient que des noms, pas de verbes. La compilation et le test sont des tâches implicitement gérées par iwant afin d'accorder à l'utilisateur les noms qu'il souhaite. Ce n'est pas la langue. C'est ainsi que vous l'utilisez.
"Java est verbeux"
Oui, beaucoup de code Java est verbeux. Mais encore une fois, ce n'est pas la langue, c'est la façon dont vous l'utilisez. Si une implémentation est verbeuse, il suffit de l'encapsuler derrière une belle abstraction. De nombreuses GPL fournissent des mécanismes adéquats pour cela.
Imaginez simplement l'extrait Java ci-dessus écrit en XML. Remplacez les parenthèses par des équerres et déplacez-les. Et puis dupliquez chaque mot-clé comme une balise de fermeture! Java en tant que syntaxe n'est pas verbeux.
(Je sais, comparer à XML, c'est comme prendre des bonbons à un bébé, mais tant de builds se trouvent être définis en XML.)
"Vous devrez compiler votre script de construction"
Ceci est un point valable. Néanmoins, ce n'est qu'un problème technique mineur à résoudre. J'aurais pu le résoudre en utilisant beanshell ou un autre interprète. Au lieu de cela, je l'ai résolu en le traitant comme un autre problème de construction et en amorçant iwant avec un simple shell ou script ant qui compile et exécute un simple bootstrapper Java.
"Java a passe-partout"
Vrai. Vous devez importer des classes, vous devez mentionner "public", "class" et ainsi de suite. Et ici, de simples DSL externes marquent une première victoire facile.
Et si votre projet est si banal que ce passe-partout est important, bravo. Votre problème n'est pas difficile et peu importe comment vous le résolvez.
Mais de nombreux projets nécessitent bien plus que la compilation, le rapport de couverture et le packaging. Si le passe-partout de Java est acceptable pour les problèmes des clients, pourquoi ne pas créer des problèmes? Pourquoi fabriquer des chaussures uniquement pour les enfants des autres?