Gradle Wrapper가 VCS에 커밋되어야하는 이유는 무엇입니까?


148

Gradle의 설명서에서 : https://docs.gradle.org/current/dsl/org.gradle.api.tasks.wrapper.Wrapper.html

이 태스크에서 생성 된 스크립트는 버전 제어 시스템에 적용되도록 설계되었습니다. 이 작업은 또한 작은 gradle-wrapper.jar 부트 스트랩 JAR 파일 및 VCS에 커밋해야하는 특성 파일을 생성합니다. 스크립트는이 JAR에 위임합니다.

From : 소스 제어하에 있어서는 안되는 것은 무엇입니까?

Generated filesVCS에 있어서는 안된다고 생각 합니다.

언제 gradlew그리고 gradle/gradle-wrapper.jar필요합니까?

왜이 아닌 저장 gradle versionbuild.gradle파일?


1
아래의 답변을 고려할 때 흥미로운 측면 토론은 지속적인 통합 도구 형식을 사용하는 경우 이러한 파일의 유용성입니다. 어떤 것들이 그레이드 래퍼를 확인하고 거기에 있다면 그것을 사용할 것입니까?
lilbyrdie 2016 년

답변:


124

gradle wrapper의 요점은 gradle을 설치하지 않고 작동 방식을 알지 않고도 VCS에서 프로젝트를 복제하고 gradlew 스크립트를 실행하기 위해 다운로드 할 위치, 버전 추가 단계없이 프로젝트를 포함하고 빌드합니다.

build.gradle 파일의 gradle 버전 번호 만 있으면 gradle 버전 X를 URL Y에서 다운로드하여 설치해야한다는 점을 설명하는 README가 필요하며 버전이 증가 할 때마다 수행해야합니다.


94
바보입니다. VCS에는 gradle-wrapper.jar이 필요하지 않습니다. 필요한 경우 Gradle은 첫 번째 버전을 설치 한 후 모든 버전을 다운로드 할 수 있어야합니다. 툴체인은 VCS와는 아무런 관련이 없습니다. 귀하의 답변이 옳다는 것을 이해하고 Gradle의 디자인입니다. 그러나이 디자인은 터무니 없다.
Marc Plano-Lesay

26
요점은 이전에 gradle을 설치하지 않고도 gradle을 다운로드 할 수 있다는 것 입니다. VCS에 50KB의 대용량 파일이 있으면 어떤 문제가 있습니까?
JB 니 제트

59
문제는 프로젝트의 일부가 아니라는 것입니다. 프로젝트를 빌드하는 데 사용하는 도구입니다. JDK를 VCS에 저장하지 않습니까? C 응용 프로그램에 대한 GCC도 없습니까? 그렇다면 왜 Gradle 부품을 보관 하시겠습니까? 개발자가 Gradle을 직접 읽고 설치할 수 없다면 또 다른 문제입니다.
Marc Plano-Lesay

26
문제는 릴리스 된 지 2 년이 지난 후에도 v1.0 버전의 소프트웨어를 빌드하는 데 사용 된 Gradle 버전을 기억할 수 없으며이 1.0을 계속 사용하는 고객을 위해 핫픽스를 설치해야한다는 것입니다 버전이며 업그레이드 할 수 없습니다. gradle wrapper는 다음을 해결합니다. VCS에서 1.0 태그를 복제하고 gradlew를 사용하여 빌드하고 2 년 전에 사용 된 gradle 버전을 사용하여 1.0 버전을 빌드합니다.
JB 니 제트

33
사용할 Gradle 버전을 프로젝트 어딘가에 표시해야한다는 데 동의합니다. 그러나 Gradle은 외부 도구이므로 README 또는 나열된 항목과 비교할 수 없습니다. Gradle은 VCS에 jar를 저장하지 않고도 해당 버전 자체를 가져올 수 있어야합니다.
Marc Plano-Lesay

80

gradle 래퍼의 요점은 gradle을 설치하지 않고도 가능합니다.

같은 주장이 JDK에도 적용됩니다. 또한 커밋 하시겠습니까? 또한 모든 의존성 라이브러리를 커밋합니까?

새 버전이 릴리스 될 때 종속성을 지속적으로 업그레이드해야합니다. 보안 및 기타 버그 수정 그리고 당신이 훨씬 뒤에 도착하면 다시 최신 정보를 얻는 데 시간이 많이 걸리는 작업이 될 수 있습니다.

새로운 릴리스마다 gradle wrapper가 증가하고 커밋되면 repo가 ​​매우 커집니다. 클론이 모든 버전의 모든 버전을 다운로드하는 분산 VCS로 작업 할 때 문제가 발생합니다.

작동 방식을 몰라도

랩퍼를 다운로드하고이를 사용하여 빌드하는 빌드 스크립트를 작성하십시오. 모든 사람이 스크립트의 작동 방식을 알 필요는 없으며 프로젝트를 실행하여 빌드한다는 데 동의해야합니다.

, 다운로드 위치, 버전

task wrapper(type: Wrapper) {
 gradleVersion = 'X.X' 
}

그리고

gradle wrapper

올바른 버전을 다운로드하려면

VCS에서 프로젝트를 복제하고 포함 된 gradlew 스크립트를 실행하고 추가 단계없이 프로젝트를 빌드합니다.

위의 단계로 해결되었습니다. gradle wrapper를 다운로드하는 것은 다른 종속성을 다운로드하는 것과 다르지 않습니다. 스크립트는 현행 gradle 래퍼를 확인하고 새 버전이있는 경우에만 다운로드하는 것이 현명합니다.

개발자가 이전에 Gradle을 사용한 적이없고 Gradle을 사용하여 프로젝트가 빌드되었는지 알지 못하는 경우. 그런 다음 "gradlew build"를 실행하는 것과 비교하여 "build.sh"를 실행하는 것이 더 분명합니다.

build.gradle 파일의 gradle 버전 번호 만 있으면 gradle 버전 X를 설치된 URL Y에서 다운로드해야한다고 설명하는 README가 필요합니다.

아니요, README가 필요하지 않습니다. 하나는 가질 수 있지만 우리는 개발자이며 가능한 한 자동화해야합니다. 스크립트를 작성하는 것이 좋습니다.

버전이 증가 할 때마다해야합니다.

개발자가 올바른 프로세스에 동의하는 경우 :

  1. 복제 저장소
  2. 빌드 스크립트 실행

그런 다음 최신 gradle 래퍼로 업그레이드해도 아무런 문제가 없습니다. 마지막 실행 이후에 버전이 증가하면 스크립트가 새 버전을 다운로드 할 수 있습니다.


2
"종속성은 지속적으로 업그레이드해야합니다." 그렇습니다. 아니요, 거꾸로 보는 방향으로. 이전 빌드를 재현하려면 특정 버전의 종속성이 있어야합니다. Gradle은 일부 유형의 프로젝트를보다 빠르고 쉽게 처리 할 수 ​​있도록합니다. 복제 및 감사가 필요한 조직에서는 혼란 스러울 수 있습니다.
lilbyrdie 2016 년

3
무슨 뜻인지 잘 모르겠습니다. 당신이있는 경우 그러나 build.gradle버전 제어와 그 안에 당신은 : task wrapper(type: Wrapper) { gradleVersion = 'X.X' } 그런 다음 gradle wrapper사용 된 래퍼를 다운로드합니다, 당신은 이전 빌드를 재현 할 수 있습니다.
Tomas Bjerre

1
gradle 버전이 아닌 종속성에 대한 내용을 언급하고있었습니다. 물론, 라이브러리에 모든 최신 보안 및 버그 수정이 포함 되길 원하지만 감사 또는 법적 목적으로 오래된 빌드를 재현하려고 할 때는 아닙니다. 라이브러리와 빌드 프로세스가 가능하면 이진 동일한 출력을 생성 할 수 있기를 원합니다. 라이브러리 종속성과 마찬가지로 빌드시 특정 버전을 사용할 수 있다는 보장이 없습니다. 현재 2 주 후 또는 20 년 후일 것입니다. 예, 일부 프로젝트의 경우 라이브러리 및 SDK와 동일합니다.
lilbyrdie

3
래퍼는 역사적 이유로 주로 존재한다고 생각합니다. 처음에는 모든 사람이 Maven을 사용하고 있으며 아무도 Gradle을 설치하지 않았습니다. 동료가 알 수없는 침입 종속성을 설치하도록 설득하기가 어려우므로 래퍼가 부트 스트랩을 도와줍니다. 오늘날 모든 사람들은 이미 Gradle을 가지고 있으며 래퍼는 중복됩니다.
Franklin Yu

1
gradle wrapper모든 빌드에서 복제 후 실행을 제안하고 있습니까? 기본적으로 래퍼를 쓸모 없게 만듭니다. 요점은 프로젝트를 빌드하기 위해 Gradle을 로컬로 설치할 필요 가 없기 때문입니다 !
Xerus

41

간단한 접근 방식을 추천하고 싶습니다.

프로젝트의 README에서 설치 단계가 필요하다는 것을 문서화하십시오.

gradle wrapper --gradle-version 3.3

Gradle 2.4 이상에서 작동합니다. "build.gradle"에 전용 작업을 추가 할 필요없이 래퍼를 만듭니다.

이 옵션을 사용하면 버전 제어를 위해 다음 파일 / 폴더를 무시하십시오 (체크인하지 마십시오).

  • ./gradle
  • gradlew
  • gradlew.bat

주요 이점은 소스 제어를 위해 다운로드 한 파일을 체크인 할 필요가 없다는 것입니다. 설치시 추가 단계가 필요합니다. 그만한 가치가 있다고 생각합니다.


15
왜 래퍼가 필요할까요? 래퍼의 전체 아이디어는 시스템에서 gradle을 사용하지 않고도 프로젝트를 빌드 할 수 있다는 것입니다.
edio

4
좋은 해결책. 자식에 바이너리가 없으며 여전히 사용할 수 있습니다 gradlew. @edio 특정 버전의 gradle 을 다운로드하고 사용하려면 필요합니다 .
Kirill

3

"프로젝트"는 무엇입니까?

빌드 스크립트를 제외하고이 관용구에 대한 기술적 정의가있을 수 있습니다. 그러나이 정의를 받아들이면 "프로젝트"가 버전 관리에 필요한 모든 것이 아니라고 말해야합니다!

그러나 우리는 "프로젝트"를 말한다면이며 모든 것을 당신이 수행했다 . 그런 다음 포함해야한다고 말할 수 있습니다. VCS .

이것은 매우 이론적이며 개발 작업의 경우 실용적이지 않을 수 있습니다. 따라서 " 프로젝트는 파일을 직접 편집해야하는 모든 파일 (또는 폴더) 입니다 "로 변경합니다 .

"직접"은 "간접적으로"가 아닌 것을 의미하고 "간접적으로"는 다른 파일을 편집하여이 파일에 효과가 반영됨을 의미합니다 .

따라서 OP가 말한 것과 동일하게 도달합니다 ( 여기서 설명 ).

생성 된 파일은 VCS에 없어야한다고 생각합니다.

예. 당신 이 그들을 만들지 않았기 때문에 . 따라서 두 번째 정의에 따라 "프로젝트"의 일부가 아닙니다.


이 파일들에 대한 결과는 무엇입니까?

  • build.gradle : 예. 편집해야합니다. 우리의 작품은 버전 화되어야합니다.

    참고 : 편집 위치에는 차이가 없습니다. 텍스트 편집기 환경 또는 프로젝트 구조 GUI 환경에서. 어쨌든 당신 은 그것을 직접 하고 있습니다 !

  • gradle-wrapper.properties : 예. 이 파일에서 최소한 Gradle 버전을 결정해야합니다.

  • gradle-wrapper.jar and gradlew [.bat] : 나는 지금까지 내 개발 작업에서 그것들을 만들거나 편집하지 않았다! 답은 "아니오"입니다. 그렇게 한 경우 해당 작업에서 사용자에 대해 "예"로 (그리고 편집 한 동일한 파일에 대한) 대답이됩니다.


최신 사건에 대해 중요한 점은 당신의 repo를 복제합니다 사용자가에서이 명령을 실행 할 필요가있다 REPO의<root-directory>자동 생성을 파일 랩퍼 :

> gradle wrapper --gradle-version=$v --distribution-type=$distType

$v$distType에서 결정됩니다 gradle-wrapper.properties :

distributionUrl=https\://services.gradle.org/distributions/gradle-{$v}-{$distType}.zip

자세한 내용은 https://gradle.org/install/ 을 참조하십시오.

gradle실행 파일은 bin/gradle[.bat]로컬 배포에 있습니다. 로컬 배포가 리포지토리에서 결정된 배포와 동일 할 필요는 없습니다. 후 래퍼 파일 다음 생성은 gradlew[.bat](로컬에 존재하는 경우) 자동으로 Gradle을 분포를 결정 다운로드 할 수 있습니다. 그런 다음 gradle위의 지침을 사용 하여 새 다운로드 파일 (다운로드 한 배포판)을 사용 하여 래퍼 파일을 재생성해야합니다 .


참고 : 사용자 가정 위의 지침에서는이 적어도 하나의 로컬 Gradle을 배포 (예를 ~/.gradle/wrapper/dists/gradle-4.10-bin/bg6py687nqv2mbe6e1hdtk57h/gradle-4.10). 거의 모든 실제 사례를 다룹니다. 그러나 사용자가 아직 배포를하지 않은 경우 어떻게됩니까?

.properties파일 의 URL을 사용하여 수동으로 다운로드 할 수 있습니다 . 그러나 래퍼가 예상 한 경로에서 찾지 못하면 래퍼 가 다시 다운로드합니다! 예상 경로는 완전히 예측 가능하지만 주제를 벗어났습니다 ( 가장 복잡한 부분 은 여기 참조 ).

더 쉬운 (더러운) 방법도 있습니다. 예를 들어, 다른 로컬 / 원격 리포지토리에서 래퍼 파일 ( .properties파일 제외 )을 다른 리포지토리로 복사 한 다음 리포지토리에서 실행할 gradlew수 있습니다. 적절한 배포판을 자동으로 다운로드합니다.


1

Gradle docs 에 따르면 개발자가 Gradle Wrapper를 사용할 수있게 하는 gradle-wrapper.jar것은 VCS에 추가 될 것으로 예상 됩니다.

래퍼 파일을 다른 개발자 및 실행 환경에서 사용할 수있게하려면 파일 제어를 버전 제어로 확인해야합니다. JAR 파일을 포함한 모든 랩퍼 파일의 크기는 매우 작습니다. 버전 제어에 JAR 파일 추가가 예상됩니다. 일부 조직에서는 프로젝트가 이진 파일을 버전 관리에 제출하도록 허용하지 않습니다. 현재이 접근법에는 다른 대안이 없습니다.


1

오래된 질문, 신선한 답변. gradle을 자주 업그레이드하지 않으면 (대부분은 그렇지 않습니다) VCS에 커밋하는 것이 좋습니다. 그리고 주된 이유는 CI 서버의 빌드 속도를 높이는 것입니다. 오늘날 대부분의 프로젝트는 매번 다른 서버 인스턴스 인 CI 서버에 의해 구축되고 설치됩니다.

커밋하지 않으면 CI 서버는 모든 빌드마다 jar 파일을 다운로드하여 빌드 시간을 크게 증가시킵니다. 이 문제를 처리하는 다른 방법이 있지만이 방법을 유지 관리하는 것이 가장 쉽다는 것을 알았습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.