Java를 겨냥한 다른 빌드 도구가 실제로 무엇을 얻습니까?
다른 도구보다 Gradle을 사용하는 이유는 무엇입니까?
Java를 겨냥한 다른 빌드 도구가 실제로 무엇을 얻습니까?
다른 도구보다 Gradle을 사용하는 이유는 무엇입니까?
답변:
내가 사용하지 않는 Gradle을을 자신 (지금까지 그냥 장난감 프로젝트) 분노 [그들은 단지 장난감 프로젝트 Gradle을 사용했다 저자 수단 지금까지하지 Gradle을 장난감 프로젝트입니다 - 코멘트보기]를 ,하지만 난 말 것 Ant와 Maven의 좌절 때문에 사용을 고려할 이유가 있습니다.
내 경험에 따르면 Ant는 종종 쓰기 전용 입니다. 사소하지 않은 프로젝트의 경우 마음을 사로 잡는 복잡한 빌드가 실제로 이식 가능하도록 세심한주의를 기울입니다. 명령적인 특성으로 인해 빌드 간 구성 복제가 발생할 수 있습니다 (매크로가 여기서 도움이 될 수 있음).
Maven은 반대 방식을 취하며 Maven 라이프 사이클과 완전히 통합 될 것으로 기대합니다. 숙련 된 Ant 사용자는 Maven이 Ant에있는 많은 자유를 제거하므로 특히 문제가됩니다. 예를 들어 많은 Maven 비판과 그 답변을 열거 한 Sonatype 블로그 가 있습니다.
Maven 플러그인 메커니즘은 매우 강력한 빌드 구성을 허용하며 상속 모델은 전체 엔터프라이즈에 대한 빌드 구성을 캡슐화하는 작은 상위 POM 세트를 정의 할 수 있으며 개별 프로젝트는 이러한 구성을 상속하여 경량으로 남겨 둘 수 있습니다. Maven 구성은 매우 장황하며 (Maven 3에서이를 해결하겠다고 약속하지만) "Maven 방식이 아닌"작업을 수행하려면 플러그인을 작성하거나 해키 앤트 통합을 사용해야합니다. 참고 Maven 플러그인을 작성하는 것을 좋아하지만 많은 사람들이 관련된 노력에 반대 할 것입니다.
Gradle은 Ant와 Maven 사이의 스위트 스팟을 공격 할 것을 약속합니다. 의존성 해결을 위해 Ivy 의 접근 방식을 사용합니다 . 구성에 대한 컨벤션을 허용하지만 일급 시민으로서의 Ant 태스크도 포함합니다. 현명하게 기존 Maven / Ivy 리포지토리를 사용할 수 있습니다.
따라서 Ant / Maven의 고통 지점에 부딪쳤다면 Gradle을 사용해 볼 가치가 있습니다.하지만 내 생각으로는 알 수없는 문제에 대해 알려진 문제를 다루지 않는 경우 볼 수 있습니다. 푸딩의 증거는 먹기 때문에 제품이 조금 더 성숙하고 다른 사람들이 꼬임을 다룰 때까지 판단을 내릴 것입니다 (그 이유는 출혈 가장자리라고 부릅니다). 나는 여전히 내 장난감 프로젝트에서 그것을 사용할 것입니다. 항상 옵션을 알고있는 것이 좋습니다.
Gradle은 많은 용도로 사용될 수 있습니다-Ant보다 훨씬 나은 스위스 군용 칼이지만 특히 다중 프로젝트 빌드에 중점을 둡니다.
우선 Gradle은 종속성 프로그래밍 도구이며 프로그래밍 도구이기도합니다. Gradle을 사용하면 설정에서 임의의 작업을 실행할 수 있으며 Gradle은 선언 된 모든 종속 항목이 올바르게 적시에 실행되도록합니다. 코드는 모든 종류의 레이아웃 (tree, flat, scattered 등)으로 많은 디렉토리에 분산 될 수 있습니다.
Gradle에는 평가와 실행이라는 두 가지 단계가 있습니다. 기본적으로 Gradle은 평가하는 동안 찾고자하는 디렉토리에서 빌드 스크립트를 찾아 평가합니다. 실행하는 동안 Gradle은 작업 상호 종속성을 고려하여 평가 중에로드 된 작업을 실행합니다.
이러한 종속성 프로그래밍 기능 외에도 Gradle은 Apache Ivy와 통합하여 프로젝트 및 JAR 종속성 기능을 추가합니다. 아시다시피 아이비는 Maven보다 훨씬 강력하고 덜 의존적 인 종속성 관리 도구입니다.
Gradle은 프로젝트 간 및 프로젝트와 JAR 간의 종속성을 감지합니다. Gradle은 iBiblio 하나 또는 자신의 저장소와 같은 Maven 저장소 (다운로드 및 업로드)와 함께 작동하지만 보유하고있는 다른 종류의 저장소 인프라도 지원합니다.
다중 프로젝트 빌드에서 Gradle은 적응 가능하며 빌드의 구조 및 아키텍처에 적합합니다. Maven에 필요한 구조 또는 아키텍처를 빌드 도구에 맞게 조정할 필요는 없습니다.
Gradle은 Maven이 거의 절대로하지 않는 노력으로 방해하지 않도록 열심히 노력합니다. 컨벤션은 훌륭하지만 유연성도 마찬가지입니다. Gradle은 Maven보다 더 많은 기능을 제공하지만 가장 중요한 경우 Gradle은 Maven에서 멀지 않은 전환 경로를 제공합니다.
이것은 논란의 여지가 있지만 Gradle은 본격적인 프로그래밍 언어라는 사실을 숨기지 않습니다.
Ant + Ant-contrib은 본질적으로 아무도 프로그래밍하기를 원하지 않는 완벽한 프로그래밍 언어입니다.
Maven은 완전히 선언적이며 논리가 필요한 경우 플러그인을 작성하고 컴파일하도록 반대하는 접근법을 시도합니다. 또한 완전히 융통성이없는 프로젝트 모델을 부과합니다. Gradle은 이러한 모든 도구를 최대한 활용합니다.
Gradle은 내가 아직 사용하지 않은 가장 구성 가능하고 유연한 빌드 도구입니다. DSL과 구성과 같은 개념을 배우려면 약간의 투자가 필요하지만, 말도 안되고 완벽하게 구성 가능한 JVM 빌드 도구가 필요한 경우 이길 수 없습니다.
Gradle은 Ant와 Maven을 훌륭하게 결합하여 두 프레임 워크를 최대한 활용합니다. Ant의 유연성 및 Maven의 구성, 종속성 관리 및 플러그인에 대한 규칙.
따라서 maven에서와 같이 표준 Java 빌드를 원하지만 테스트 작업은 다음과 같이 사용자 정의 단계를 수행해야합니다.
build.gradle :
apply plugin:'java'
task test{
doFirst{
ant.copy(toDir:'build/test-classes'){fileset dir:'src/test/extra-resources'}
}
doLast{
...
}
}
또한 그루비 구문을 사용하여 ant / maven의 xml보다 훨씬 많은 표현력을 제공합니다.
Ant의 수퍼 세트입니다. 모든 Ant 태스크를보다 멋지고 멋진 같은 구문으로 gradle에 사용할 수 있습니다.
ant.copy(file:'a.txt', toDir:"xyz")
또는
ant.with{
delete "x.txt"
mkdir "abc"
copy file:"a.txt", toDir: "abc"
}
우리는 Gradle을 사용하고 Maven과 Ant보다 선택했습니다. Ant는 우리에게 완전한 유연성을 제공했으며 Ivy는 Maven보다 더 나은 종속성 관리 기능을 제공하지만 다중 프로젝트 빌드에 대한 큰 지원은 없습니다. 다중 프로젝트 빌드를 지원하기 위해 많은 코딩을 수행하게됩니다. 또한 컨벤션별로 빌드하는 것이 좋으며 빌드 스크립트를보다 간결하게 만듭니다. Maven을 사용하면 너무 많은 규칙에 따라 빌드가 이루어지며 빌드 프로세스를 사용자 정의하면 해킹이됩니다. 또한 Maven은 이슈를 게시하는 모든 프로젝트를 홍보합니다. 때로는 프로젝트를 하위 프로젝트로 분할했지만 모든 하위 프로젝트를 함께 빌드하고 버전을 관리하려고합니다. 실제로 Maven을 위해 설계된 것은 아닙니다.
Gradle을 사용하면 Maven의 규칙에 따라 Ant의 유연성을 확보하고 빌드 할 수 있습니다. 예를 들어, 고유 한 작업으로 기존 빌드 수명주기를 연장하는 것은 쉽지 않습니다. 그리고 원하지 않으면 컨벤션을 사용하지 않아도됩니다. Groovy는 XML보다 코딩하기가 훨씬 좋습니다. Gradle에서 각각에 대한 아티팩트를 저장소에 공개하지 않고도 로컬 파일 시스템의 프로젝트 간 종속성을 정의 할 수 있습니다. 마지막으로 Gradle은 Ivy를 사용하므로 탁월한 종속성 관리 기능이 있습니다. 지금까지 나에게 유일한 단점은 성숙한 Eclipse 통합이 없다는 것입니다.하지만 Maven의 옵션은 그리 좋지 않습니다.
이것은 내 대답이 아니지만 분명히 나와 공명합니다. 2012 년 10 월의 ThoughtWorks Technology Radar 에서 나왔습니다 .
Ant 및 Maven과 같은 XML 기반 빌드 도구를 사용하면 두 가지 문제가 발생했습니다. 너무 많은 뾰족한 버팀대와 플러그인 아키텍처의 조잡함. 구문 문제는 생성을 통해 처리 할 수 있지만 플러그인 아키텍처는 프로젝트가 복잡 해짐에 따라 빌드 도구가 정상적으로 확장되는 기능을 심각하게 제한합니다. 우리는 플러그인이 잘못된 추상화 수준이라고 생각하고 Gradle 및 Rake와 같은 언어 기반 도구를 선호합니다.
Gradle은 재미를 다시 건물 / 조립 소프트웨어로 전환했습니다. 나는 개미를 사용하여 내 경력 전체에 소프트웨어를 구축했으며 항상 개발 작업의 실제 "buildit"부분이 필요한 악으로 간주했습니다. 몇 달 전 우리 회사는 바이너리 레포 (일명 vc로 항아리 체크인)를 사용하지 않는 것에 지 쳤고 나는 이것을 조사하는 임무를 받았다. 개미 위에 볼트로 고정 할 수 있었기 때문에 담쟁이로 시작했는데, 내가 원하는대로 제작 된 인공물을 출판하는 일은 그리 운이 없었습니다. 나는 maven으로 가서 XML로 해킹하고 간단한 도우미 라이브러리를 위해 훌륭하게 일했지만 배포 준비가 된 응용 프로그램을 번들로 묶는 데 심각한 문제가 발생했습니다. 꽤 오랫동안 인터넷 검색 및 포럼 읽기를 번거 로웠 고 사용하기 힘든 다양한 플러그인에 대한 수조 개의 지원 병을 다운로드하지 못했습니다.
그러나 첫날부터 기분이 좋아지기 시작했습니다. 나는 어딘가에 도착했다. 첫 번째 개미 모듈을 마이그레이션하는 데 2 시간이 걸렸으며 빌드 파일은 기본적으로 아무것도 아닙니다. 한 화면에 쉽게 장착 할 수 있습니다. 큰 "wow"는 XML로 스크립트를 작성 하는 것이 얼마나 어리석은가? 하나의 의존성을 선언하면 한 행이 필요하다는 사실은 매우 호소력이 있습니다-> 한 페이지에서 특정 프로젝트에 대한 모든 의존성을 쉽게 볼 수 있습니다. 그때부터 나는 지금까지 직면 한 모든 문제에 대해 단순하고 우아한 해결책이 있습니다. 나는 이것이 이유라고 생각합니다.
이제 저는 빌드 프로세스에 추가 할 새로운 기능을 생각하려고 노력합니다. 얼마나 아파요?
기본 빌드를 관리하는 것이 훨씬 쉽습니다. Ant와 Maven은 사실상 Java 전용입니다. Maven 용 일부 플러그인은 일부 기본 프로젝트를 처리하려고 시도하지만 효과적인 작업을 수행하지 않습니다. 기본 프로젝트를 컴파일하는 Ant 태스크를 작성할 수 있지만 너무 복잡하고 어색합니다.
우리는 JNI와 다른 많은 고유 비트로 Java를 수행합니다. Gradle은 Ant 엉망을 상당히 단순화했습니다. 네이티브 프로젝트에 의존성 관리를 도입하기 시작했을 때는 혼란 스러웠습니다. 우리는 그것을 Maven으로 만들었지 만, 동등한 Gradle 코드는 Maven에서 필요한 것의 작은 부분이며 사람들은 Maven 전문가가되지 않고 그것을 읽고 이해할 수있었습니다.
Ed Staub에 동의합니다. Gradle은 maven에 비해 확실히 강력하며 장기적으로 더 많은 유연성을 제공합니다.
maven에서 gradle로 이동하기 위해 평가를 수행 한 후, gradle에서 발생한 두 가지 문제에 대해 maven 자체를 고수하기로 결정했습니다 (속도가 maven보다 느리고 프록시가 작동하지 않음).