Làm thế nào / khi nào để tạo tập tin trình bao bọc Gradle?


212

Tôi đang cố gắng hiểu cách thức hoạt động của Gradle Wrapper. Trong nhiều repos nguồn, tôi thấy cấu trúc sau:

projectRoot/
    src/
    build.gradle
    gradle.properties
    settings.gradle
    gradlew
    gradlew.bat
    gradle/
        wrapper/
            gradle-wrapper.jar
            gradle-wrapper.properties

Những câu hỏi của tôi:

  1. Làm thế nào / khi nào một người tạo gradlew/ gradlew.bat? Bạn có phải tạo ra chúng chỉ một lần khi dự án được tạo lần đầu tiên, bạn có tạo chúng mỗi khi bạn cam kết / đẩy thay đổi không? Và chúng được tạo ra như thế nào?
  2. Câu hỏi tương tự ở trên, nhưng đối với các gradle/wrapper/*tệp ( gradle-wrapper.jargradle-wrapper.properties)?
  3. Đôi khi tôi thấy các *.gradletệp khác trong gradlethư mục của dự án . Những tập tin Gradle bổ sung này là gì và chúng đại diện / làm gì? Plugin tùy chỉnh?
  4. Sự khác biệt trong các thuộc tính đi vào settings.gradleso với những gì cần được xác định bên trong là gradle.propertiesgì?

Câu trả lời:


250
  1. Bạn tạo nó một lần và một lần nữa khi bạn muốn thay đổi phiên bản Gradle bạn sử dụng trong dự án. Không cần phải tạo ra thường xuyên như vậy. Dưới đây là các tài liệu. Chỉ cần thêm wrappertác vụ vào build.gradletệp và chạy tác vụ này để có được cấu trúc trình bao bọc.

    Lưu ý rằng bạn cần phải cài đặt Gradle để tạo một trình bao bọc. Công cụ tuyệt vời để quản lý các tạo phẩm của hệ sinh thái g là SDKman! . Để tạo một trình bao bọc lớp, thêm đoạn mã sau vào build.gradletệp:

    task wrapper(type: Wrapper) {
       gradleVersion = '2.0' //version required
    }
    

    và chạy:

    gradle wrapper
    

    bài tập. Thêm các tệp kết quả vào SCM (ví dụ git) và từ giờ tất cả các nhà phát triển sẽ có cùng phiên bản Gradle khi sử dụng Gradle Wrapper.

    Với Gradle 2.4 (hoặc cao hơn), bạn có thể thiết lập trình bao bọc mà không cần thêm tác vụ chuyên dụng:

    gradle wrapper --gradle-version 2.3
    

    hoặc là

    gradle wrapper --gradle-distribution-url https://myEnterpriseRepository:7070/gradle/distributions/gradle-2.3-bin.zip
    

    Tất cả các chi tiết có thể được tìm thấy ở đây

Từ 3.1 --distribution-typetùy chọn Gradle cũng có thể được sử dụng. Các tùy chọn là nhị phân và tất cảbin . tất cả đều chứa mã nguồn và tài liệu. tất cả cũng tốt hơn khi IDE được sử dụng, vì vậy trình soạn thảo hoạt động tốt hơn. Nhược điểm là bản dựng có thể tồn tại lâu hơn (cần tải xuống nhiều dữ liệu hơn, vô nghĩa trên máy chủ CI) và nó sẽ tốn nhiều dung lượng hơn.

  1. Đây là các tập tin Gradle Wrapper. Bạn cần tạo chúng một lần (đối với một phiên bản cụ thể) và thêm vào kiểm soát phiên bản. Nếu bạn cần thay đổi phiên bản Gradle Wrapper, hãy thay đổi phiên bản trong build.gradlexem (1.) và tạo lại các tệp.

  2. Cho một ví dụ chi tiết. Tập tin này có thể có nhiều mục đích: dự án đa mô-đun, phân tách trách nhiệm, tập lệnh được sửa đổi một chút, v.v.

  3. settings.gradlechịu trách nhiệm thay cho cấu trúc của dự án (mô-đun, tên, v.v.), trong khi, gradle.propertiesđược sử dụng cho các chi tiết bên ngoài của dự án và Gradle (phiên bản, đối số dòng lệnh -XX, thuộc tính, v.v.)


Cảm ơn @Opal (+1) - để cung cấp cho bạn một ví dụ cụ thể cho # 3, xem Netflix-Eureka . Những tập tin Gradle này là gì?!?
smeeb

Ok, tôi thấy nó. Theo như tôi thấy, các nhà phát triển từ Netflix chỉ chia một build.gradlekịch bản lớn thành nhiều đoạn ngắn hơn và dành cho một kịch bản mục đích cụ thể. Vì bạn có thể tập lệnh nằm dưới lớp dir a được áp dụng cho build.gradletệp chính , hãy xem: github.com/Netflix/eureka/blob/master/build.gradle . Nơi bạn đặt các mô-đun như vậy là sự lựa chọn của bạn. Đó là tất cả nói chung. Nếu bạn hài lòng với câu trả lời, vui lòng chấp nhận câu trả lời :)
Opal

1
Một tùy chọn dòng lệnh hữu ích khác là --distribution-type, ví dụ:gradle wrapper --gradle-version 4.3.1 --distribution-type ALL
heenenee

1
Cảm ơn @heenenee, sẽ thêm nó vào câu trả lời của tôi.
Opal

Mẹo: Android Studio có Gradle trong thư mục cài đặt.
TWiStErRob

29

Tạo trình bao bọc Gradle

Dự án xây dựng lớp

// Top-level build file where you can add configuration options common to all sub-projects/modules.

// Running 'gradle wrapper' will generate gradlew - Getting gradle wrapper working and using it will save you a lot of pain.
task wrapper(type: Wrapper) {
    gradleVersion = '2.2' 
}

// Look Google doesn't use Maven Central, they use jcenter now.
buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:1.0.1'

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

allprojects {
    repositories {
        jcenter()
    }
}

Sau đó, tại dòng lệnh chạy

gradle wrapper

Nếu bạn thiếu lớp trên hệ thống của bạn, hãy cài đặt nó hoặc những thứ trên sẽ không hoạt động. Trên máy Mac, tốt nhất là cài đặt qua Homebrew.

brew install gradle

Sau khi bạn đã chạy thành công tác vụ bao bọc và được tạo gradlew, đừng sử dụng lớp hệ thống của bạn. Nó sẽ giúp bạn tiết kiệm rất nhiều đau đầu.

./gradlew assemble

Những gì về plugin gradle nhìn thấy ở trên?

com.android.tools.build:gradle:1.0.1

Bạn nên đặt phiên bản là mới nhất và bạn có thể kiểm tra trang công cụ và chỉnh sửa phiên bản cho phù hợp.

Xem những gì Android Studio tạo ra

Việc bổ sung gradle và Android Studio mới nhất đã thay đổi đáng kể bố cục dự án. Nếu bạn có một dự án cũ hơn, tôi khuyên bạn nên tạo một dự án sạch với Android Studio mới nhất và xem những gì Google coi là dự án tiêu chuẩn.

Android Studio có các phương tiện để nhập các dự án cũ hơn cũng có thể giúp đỡ.


gradleVersion = '2.2'trong taskWrappercó thể sử dụng bất kỳ phiên bản nào tôi muốn để tạo trình bao bọc, đúng không? Không phải là phiên bản mới nhất của gradle?
raffian

1
Tôi cho rằng bạn có thể quay lại trong loạt 2 lớp. Tôi không chắc chắn về trước 2.x, nhưng không, nó không cần phải theo phiên bản mới nhất tuyệt đối.
Cameron Lowell Palmer

18

Kể từ Gradle 2.4, bạn có thể sử dụng gradle wrapper --gradle-version X.Xđể định cấu hình một phiên bản cụ thể của trình bao bọc Gradle mà không cần thêm bất kỳ tác vụ nào vào build.gradletệp của mình . Lần sau khi bạn sử dụng trình bao bọc, nó sẽ tải xuống bản phân phối Gradle phù hợp để khớp.


10

Nếu bạn muốn tải xuống lớp với nguồn và tài liệu, url phân phối mặc định được định cấu hình trong gradle-Wrapper.properites sẽ không đáp ứng nhu cầu của bạn. Đó là https://service.gradle.org/distribution/gradle-2.10-bin.zip , không https://service.gradle.org/distribution/gradle-2.10-all.zip . Url đầy đủ này được IDE gợi ý như Android Studio. Nếu bạn muốn tải xuống lớp đầy đủ, Bạn có thể định cấu hình tác vụ trình bao bọc như thế này :

task wrapper(type: Wrapper) {
    gradleVersion = '2.13'
    distributionUrl = distributionUrl.replace("bin", "all")
}

1
Với các bản dựng lớp gần đây hơn (không chắc chắn chính xác là cái nào) - thay vì viết lại url theo cách thủ công, có lẽ tốt nhất là sử dụng lệnh inbuilt trong cùng một bao đóng: phân phối = Wrapper.DistributionType.ALL
Dave Birch

6

Đây là lệnh được sử dụng để báo cho Gradle nâng cấp trình bao bọc sao cho nó sẽ lấy các phiên bản phân phối của các thư viện bao gồm mã nguồn:

./gradlew wrapper --gradle-version <version> --distribution-type all

Chỉ định loại phân phối với "tất cả" sẽ đảm bảo Gradle tải xuống các tệp nguồn để môi trường phát triển của bạn sử dụng.

Ưu điểm :

  • IDE sẽ có quyền truy cập ngay vào mã nguồn. Ví dụ: Intellij IDEA sẽ không nhắc bạn cập nhật tập lệnh xây dựng của bạn để bao gồm bản phân phối nguồn (vì lệnh này đã làm điều đó)

Nhược điểm :

  • Quá trình xây dựng dài hơn / lớn hơn vì nó đang tải xuống mã nguồn. Đây là một sự lãng phí thời gian / không gian trên máy chủ xây dựng hoặc CI, nơi không cần mã nguồn.

Vui lòng bình luận hoặc cung cấp câu trả lời khác nếu bạn biết về bất kỳ tùy chọn dòng lệnh nào để nói với Gradle không tải xuống các nguồn trên máy chủ xây dựng.


1
Bạn có chắc chắn cài đặt này là về thư viện? Các tài liệu chính thức nói khác và chỉ đề cập đến chính trình bao bọc: "Loại phân phối Gradle được sử dụng bởi trình bao bọc." docs.gradle.org/civerse/dsl/ Mạnh
Thorsten Schöning

2
  1. Bạn sẽ tạo chúng một lần, nhưng cập nhật chúng nếu bạn cần một tính năng mới hoặc thứ gì đó từ plugin cần đến phiên bản lớp mới hơn.

    Cách dễ nhất để cập nhật: kể từ Lớp 2.2, bạn chỉ cần tải xuống và trích xuất bản phân phối Gradle hoàn chỉnh hoặc nhị phân và chạy:

    $ <pathToExpandedZip>/bin/gradle wrapper
    

    Không cần xác định một nhiệm vụ, mặc dù bạn có thể cần một số loại build.gradletệp.

    Điều này sẽ cập nhật hoặc tạo gradlewgradlew.battrình bao bọc cũng như gradle/wrapper/gradle-wrapper.propertiesgradle-wrapper.jarđể cung cấp phiên bản hiện tại của lớp, gói.

  2. Đó là tất cả các phần của bọc.

  3. Một số build.gradletệp tham chiếu các tệp hoặc tệp khác trong thư mục con là các dự án phụ hoặc mô-đun. Nó có một chút phức tạp, nhưng nếu bạn có một dự án về cơ bản bạn cần một tệp.

  4. settings.gradlexử lý dự án, mô-đun và các loại tên và cài đặt khác, gradle.propertiesđịnh cấu hình các biến có thể sử dụng lại cho các tệp lớp của bạn nếu bạn muốn và bạn cảm thấy chúng sẽ rõ ràng hơn theo cách đó.


2

Vì các nhiệm vụ tích hợp sẵn không được chấp nhận trong 4.8, hãy thử bên dưới

wrapper {
   gradleVersion = '2.0' //version required
}

và chạy

gradle wrapper
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.