Bagaimana / kapan membuat file wrapper Gradle?

212

Saya mencoba memahami cara kerja Gradle Wrapper. Dalam banyak repo sumber, saya melihat struktur berikut:

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

Pertanyaan saya:

  1. Bagaimana / kapan seseorang menghasilkan gradlew/ gradlew.bat? Apakah Anda seharusnya membuat mereka hanya satu kali ketika proyek pertama kali dibuat, apakah Anda menghasilkan mereka setiap kali Anda melakukan / mendorong perubahan? Dan bagaimana mereka dihasilkan?
  2. Pertanyaan yang sama di atas, tetapi untuk gradle/wrapper/*file ( gradle-wrapper.jardan gradle-wrapper.properties)?
  3. Beberapa kali saya melihat *.gradlefile lain di dalam gradledirektori proyek . Apa file Gradle tambahan ini dan apa yang mereka wakili / lakukan? Plugin khusus?
  4. Apa perbedaan dalam sifat yang masuk ke settings.gradlevs apa yang harus didefinisikan di dalam gradle.properties?
smeeb
sumber

Jawaban:

251
  1. Anda menghasilkannya sekali, dan lagi ketika Anda ingin mengubah versi Gradle yang Anda gunakan dalam proyek. Tidak perlu menghasilkan begitu sering. Ini dokumennya. Cukup tambahkan wrappertugas ke build.gradlefile dan jalankan tugas ini untuk mendapatkan struktur pembungkus.

    Perlu diingat bahwa Anda perlu menginstal Gradle untuk menghasilkan pembungkus. Alat hebat untuk mengelola artefak g-ekosistem adalah SDKMAN! . Untuk menghasilkan pembungkus gradle, tambahkan potongan kode berikut ke build.gradlefile:

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

    dan lari:

    gradle wrapper
    

    tugas. Tambahkan file yang dihasilkan ke SCM (misalnya git) dan mulai sekarang semua pengembang akan memiliki versi Gradle yang sama saat menggunakan Gradle Wrapper.

    Dengan Gradle 2.4 (atau lebih tinggi) Anda dapat mengatur pembungkus tanpa menambahkan tugas khusus:

    gradle wrapper --gradle-version 2.3
    

    atau

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

    Semua detail dapat ditemukan di sini

Dari 3.1 --distribution-typeopsi Gradle juga bisa digunakan. Opsinya adalah biner dan semua dan bin . semua tambahan berisi kode sumber dan dokumentasi. semuanya juga lebih baik ketika IDE digunakan, jadi editor bekerja lebih baik. Kekurangannya adalah build mungkin bertahan lebih lama (perlu mengunduh lebih banyak data, tidak berguna di server CI) dan itu akan memakan lebih banyak ruang.

  1. Ini adalah file Gradle Wrapper. Anda perlu membuatnya sekali (untuk versi tertentu) dan menambahkan ke kontrol versi. Jika Anda perlu mengubah versi Gradle Wrapper, ubah versi di build.gradlelihat (1.) dan buat ulang file.

  2. Berikan contoh detail. File tersebut dapat memiliki beberapa tujuan: proyek multi-modul, pemisahan tanggung jawab, skrip yang sedikit dimodifikasi, dll.

  3. settings.gradlelebih bertanggung jawab atas struktur proyek (modul, nama, dll), sementara, gradle.propertiesdigunakan untuk detail eksternal proyek dan Gradle (versi, argumen baris perintah -XX, properti, dll.)

Opal
sumber
Terima kasih @Opal (+1) - untuk memberi Anda contoh spesifik untuk # 3, lihat Netflix-Eureka . Apa file Gradle ini?!?
smeeb
Oke, saya melihatnya. Sejauh yang saya lihat, pengembang dari Netflix hanya membagi satu build.gradleskrip besar menjadi beberapa skrip pendek, dan dikhususkan untuk satu skrip tujuan tertentu. Karena Anda dapat menempatkan skrip yang berada di bawah direktori grad ke build.gradlefile utama , lihat: github.com/Netflix/eureka/blob/master/build.gradle . Di mana Anda meletakkan modul - modul semacam itu adalah pilihan Anda. Itu semua secara umum. Jika Anda puas dengan jawabannya, harap terima jawabannya :)
Opal
1
Opsi baris perintah lain yang bermanfaat adalah --distribution-type, misalnya,gradle wrapper --gradle-version 4.3.1 --distribution-type ALL
heenenee
1
Terima kasih @heenenee, akan menambahkannya ke jawaban saya.
Opal
Tip: Android Studio memiliki Gradle di folder instalasinya.
TWiStErRob
29

Menghasilkan Gradle Wrapper

Proyek membangun gradle

// 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()
    }
}

Kemudian pada menjalankan baris perintah

gradle wrapper

Jika Anda kehilangan gradle di sistem, instal atau yang di atas tidak akan berfungsi. Pada Mac, yang terbaik adalah menginstal melalui Homebrew.

brew install gradle

Setelah Anda berhasil menjalankan tugas pembungkus dan dihasilkan gradlew, jangan gunakan gradasi sistem Anda. Ini akan menghemat banyak sakit kepala.

./gradlew assemble

Bagaimana dengan plugin gradle yang terlihat di atas?

com.android.tools.build:gradle:1.0.1

Anda harus mengatur versi menjadi yang terbaru dan Anda dapat memeriksa halaman alat dan mengedit versi yang sesuai.

Lihat apa yang dihasilkan Android Studio

Penambahan gradle dan Android Studio terbaru telah mengubah tata letak proyek secara dramatis. Jika Anda memiliki proyek yang lebih lama, saya sangat merekomendasikan membuat yang bersih dengan Android Studio terbaru dan melihat apa yang dianggap Google sebagai proyek standar.

Android Studio memiliki fasilitas untuk mengimpor proyek lama yang juga dapat membantu.

Cameron Lowell Palmer
sumber
gradleVersion = '2.2'di taskWrapperdapat menggunakan versi apa pun yang saya inginkan untuk menghasilkan bungkus, benar? Tidak harus menjadi gradle versi terbaru?
raffian
1
Saya kira Anda bisa kembali ke 2-series gradle. Saya sama sekali tidak yakin tentang sebelum 2.x, tapi tidak, itu tidak perlu mengikuti versi terbaru absolut.
Cameron Lowell Palmer
18

Pada Gradle 2.4, Anda dapat menggunakan gradle wrapper --gradle-version X.Xuntuk mengkonfigurasi versi spesifik pembungkus Gradle, tanpa menambahkan tugas apa pun ke build.gradlefile Anda . Lain kali Anda menggunakan pembungkus, itu akan mengunduh distribusi Gradle yang sesuai untuk dicocokkan.

Craig Trader
sumber
10

Jika Anda ingin mengunduh gradle dengan sumber dan dokumen, url distribusi default yang dikonfigurasi dalam gradle-wrapper.properites tidak akan memuaskan kebutuhan Anda. Ini adalah https://services.gradle.org/distributions/gradle-2.10-bin.zip , tidak https://services.gradle.org/distributions/gradle-2.10-all.zip . Url lengkap ini disarankan oleh IDE seperti Android Studio.Jika Anda ingin mengunduh gradle penuh, Anda dapat mengonfigurasi tugas pembungkus seperti ini :

task wrapper(type: Wrapper) {
    gradleVersion = '2.13'
    distributionUrl = distributionUrl.replace("bin", "all")
}
Geng Jiawen
sumber
1
Dengan versi grader yang lebih baru (tidak yakin yang mana) - daripada menulis ulang url secara manual, mungkin yang terbaik adalah menggunakan perintah inbuilt pada penutupan yang sama: distributionType = Wrapper.DistributionType.ALL
Dave Birch
6

Ini adalah perintah yang digunakan untuk memberi tahu Gradle untuk memutakhirkan pembungkus sehingga akan mengambil versi distribusi perpustakaan yang menyertakan kode sumber:

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

Menentukan tipe distribusi dengan "semua" akan memastikan Gradle mengunduh file sumber untuk digunakan oleh lingkungan pengembangan Anda.

Pro :

  • IDE akan memiliki akses langsung ke kode sumber. Misalnya, Intellij IDEA tidak akan meminta Anda untuk memperbarui skrip build Anda untuk menyertakan distro sumber (karena perintah ini sudah melakukannya)

Cons :

  • Proses pembuatan lebih lama / lebih besar karena mengunduh kode sumber. Ini adalah pemborosan waktu / ruang pada server build atau CI di mana kode sumber tidak diperlukan.

Berikan komentar atau berikan jawaban lain jika Anda mengetahui opsi baris perintah untuk memberi tahu Gradle agar tidak mengunduh sumber di server build.

Dicukur
sumber
1
Apakah Anda yakin pengaturan ini tentang perpustakaan? Dokumen resmi mengatakan sebaliknya dan merujuk ke pembungkus itu sendiri saja: "Jenis distribusi Gradle yang akan digunakan oleh pembungkus." docs.gradle.org/current/dsl/…
Thorsten Schöning
2
  1. Anda akan membuatnya sekali, tetapi perbarui jika Anda memerlukan fitur baru atau sesuatu dari sebuah plugin yang pada gilirannya membutuhkan versi gradle yang lebih baru.

    Cara termudah untuk memperbarui: pada Gradle 2.2 Anda bisa mengunduh dan mengekstrak distribusi Gradle lengkap atau biner , dan jalankan:

    $ <pathToExpandedZip>/bin/gradle wrapper
    

    Tidak perlu mendefinisikan tugas, meskipun Anda mungkin perlu beberapa jenis build.gradlefile.

    Ini akan memperbarui atau membuat gradlewdan gradlew.batpembungkus serta gradle/wrapper/gradle-wrapper.propertiesdan gradle-wrapper.jaruntuk menyediakan versi gradle saat ini, dibungkus.

  2. Itu semua adalah bagian dari pembungkus.

  3. Beberapa build.gradlefile merujuk file lain atau file dalam subdirektori yang merupakan sub proyek atau modul. Itu menjadi sedikit rumit, tetapi jika Anda memiliki satu proyek pada dasarnya Anda memerlukan satu file.

  4. settings.gradlemenangani proyek, modul dan jenis nama dan pengaturan lainnya, gradle.propertiesmengkonfigurasi variabel yang dapat digunakan kembali untuk file gradle Anda jika Anda suka dan Anda merasa mereka akan lebih jelas seperti itu.

dlamblin
sumber
2

Karena tugas bawaan gradle tidak digunakan dalam 4.8, coba di bawah ini

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

dan lari

gradle wrapper
drafterr
sumber