De fato! Por que não usar uma linguagem poderosa e expressiva para um problema mais complexo do que as pessoas costumam pensar (inicialmente)? Especialmente quando as pessoas que enfrentam o problema já são competentes com esse idioma. (Construir é o próprio problema dos programadores e é melhor resolvido pelos programadores.)
Eu também me fiz essa pergunta anos atrás e decidi que Java é uma boa linguagem para definir builds, especialmente para projetos Java. E, como resultado, comecei a fazer algo a respeito.
AVISO LEGAL : Nesta resposta, estou promovendo o iwant , um sistema de construção que estou desenvolvendo. Mas como essa é uma discussão opinativa, tenho certeza que está tudo bem.
Não vou detalhar os benefícios do Java (poder e expressividade) ou quero especificamente. Se você estiver interessado, pode ler mais na página iwant .
Em vez disso, considerarei por que o Java (e outras GPLs) é tão prontamente descartado como inadequado para a construção. Muitas respostas e comentários aqui são bons exemplos desse pensamento. Vamos considerar alguns dos argumentos típicos:
"Java é imperativo, mas as compilações são melhor definidas de maneira declarativa" , eles podem dizer.
Verdade. Porém, ao usar uma linguagem como metalinguagem para uma DSL interna , o que realmente conta é sua sintaxe . Mesmo uma linguagem imperativa como Java pode ser enganada para ser declarativa. Se parece e parece declarativo, é (para fins práticos) declarativo. Por exemplo:
JacocoTargetsOfJavaModules.with()
.jacocoWithDeps(jacoco(), modules.asmAll.mainArtifact())
.antJars(TestedIwantDependencies.antJar(),
TestedIwantDependencies.antLauncherJar())
.modules(interestingModules).end().jacocoReport(name)
Este é um exemplo real do projeto de demonstração do iwant .
De fato, compare isso com alguns sistemas de construção supostamente declarativos que expõem seus usuários a verbos imperativos como "teste" ou "compilação". A declaração acima contém apenas substantivos, sem verbos. Compilar e testar são tarefas tratadas implicitamente por iwant, a fim de conceder ao usuário os substantivos que ele / ela deseja. Não é a linguagem. É como você o usa.
"Java é detalhado"
Sim, muitos códigos Java lá fora são detalhados. Mas, novamente, não é a linguagem, é como você a usa. Se uma implementação for detalhada, encapsule-a atrás de uma boa abstração. Muitas GPLs fornecem mecanismos adequados para isso.
Imagine o snippet Java acima, escrito em XML. Substitua parênteses por colchetes angulares e mova-os. E duplique cada palavra - chave como uma tag de fechamento! Java como uma sintaxe não é detalhado.
(Eu sei, comparar com XML é como pegar doces de um bebê, mas muitas compilações são definidas em XML.)
"Você precisaria compilar seu script de construção"
Este é um ponto válido. No entanto, é apenas um pequeno problema técnico a ser resolvido. Eu poderia ter resolvido isso usando casca de feijão ou algum outro intérprete. Em vez disso, resolvi-o tratando-o como apenas mais um problema de compilação e iniciando o boot com um simples shell ou script ant que compila e executa um bootstrapper Java simples.
"Java tem clichê"
Verdade. Você precisa importar classes, mencionar "public", "class" e assim por diante. E aqui DSLs externos simples obtêm uma vitória fácil inicial.
E se o seu projeto é tão trivial que esse padrão é significativo, parabéns. Seu problema não é difícil e realmente não importa como você o resolve.
Mas muitos projetos precisam muito mais do que compilação, relatório de cobertura e embalagem. Se o padrão do Java é aceitável para os problemas dos clientes, por que não criar problemas? Por que fazer sapatos apenas para os filhos dos outros?