Dari dokumentasi Gradle: https://docs.gradle.org/current/dsl/org.gradle.api.tasks.wrapper.Wrapper.html
Skrip yang dihasilkan oleh tugas ini dimaksudkan untuk dikomit ke sistem kontrol versi Anda. Tugas ini juga menghasilkan file JAR bootstrap gradle-wrapper.jar kecil dan file properti yang juga harus berkomitmen untuk VCS Anda. Script mendelegasikan ke JAR ini.
Dari: Apa yang TIDAK boleh berada di bawah kendali sumber?
Saya pikir Generated files
tidak boleh di VCS.
Kapan gradlew
dan gradle/gradle-wrapper.jar
dibutuhkan?
Mengapa tidak menyimpan gradle version
dalam build.gradle
file?
version-control
gradle
petani1992
sumber
sumber
Jawaban:
Karena seluruh inti dari pembungkus gradle adalah untuk dapat, tanpa pernah menginstal gradle, dan bahkan tanpa mengetahui cara kerjanya, di mana untuk mengunduhnya, dari versi mana, untuk mengkloning proyek dari VCS, untuk mengeksekusi skrip gradlew berisi, dan untuk membangun proyek tanpa langkah tambahan apa pun.
Jika semua yang Anda miliki adalah nomor versi gradle dalam file build.gradle, Anda memerlukan README yang menjelaskan kepada semua orang bahwa gradle versi X harus diunduh dari URL Y dan diinstal, dan Anda harus melakukannya setiap kali versinya bertambah.
sumber
Argumen yang sama berlaku untuk JDK, apakah Anda ingin melakukan itu juga? Apakah Anda juga melakukan semua perpustakaan dependencie Anda?
Ketergantungan harus ditingkatkan terus menerus saat versi baru dirilis. Untuk mendapatkan keamanan dan perbaikan bug lainnya. Dan karena jika Anda sampai jauh di belakang, itu bisa menjadi tugas yang sangat memakan waktu untuk mendapatkan yang terbaru.
Jika pembungkus gradle bertambah untuk setiap rilis baru, dan itu berkomitmen, repo akan tumbuh sangat besar. Masalahnya jelas ketika bekerja dengan VCS terdistribusi di mana klon akan mengunduh semua versi dari segalanya.
Buat skrip build yang mengunduh wrapper dan menggunakannya untuk membangun. Setiap orang tidak perlu tahu bagaimana skrip bekerja, mereka harus setuju bahwa proyek dibangun dengan menjalankannya.
Lalu
Untuk mengunduh versi yang benar.
Dipecahkan oleh langkah-langkah di atas. Mengunduh pembungkus gradle tidak berbeda dengan mengunduh dependensi lainnya. Script bisa jadi pintar untuk memeriksa apakah ada pembungkus gradle saat ini dan hanya mengunduhnya jika ada versi baru.
Jika pengembang belum pernah menggunakan Gradle sebelumnya dan mungkin tidak mengetahui proyek ini dibangun dengan Gradle. Maka lebih jelas untuk menjalankan "build.sh" dibandingkan dengan menjalankan "gradlew build".
Tidak, Anda tidak perlu README. Anda dapat memilikinya, tetapi kami adalah pengembang dan kami harus mengotomatiskan sebanyak mungkin. Membuat skrip lebih baik.
Jika pengembang setuju bahwa proses yang benar adalah:
Lalu ada peningkatan ke pembungkus gradle terbaru tidak masalah. Jika versi bertambah sejak dijalankan terakhir, skrip dapat mengunduh versi baru.
sumber
build.gradle
kontrol versi dan di dalamnya Anda memiliki:task wrapper(type: Wrapper) { gradleVersion = 'X.X' }
Kemudiangradle wrapper
akan mengunduh bungkus yang digunakan, dan Anda dapat mereproduksi build lama.gradle wrapper
setelah mengkloning pada setiap build? Ini pada dasarnya membuat pembungkus tidak berguna, karena intinya adalah Anda tidak harus menginstal Gradle secara lokal untuk membangun proyek !Saya ingin merekomendasikan pendekatan sederhana.
Dalam README proyek Anda, dokumentasikan langkah pemasangan yang diperlukan, yaitu:
Ini berfungsi dengan Gradle 2.4 atau lebih tinggi. Ini menciptakan pembungkus tanpa memerlukan tugas khusus untuk ditambahkan ke "build.gradle".
Dengan opsi ini, abaikan (jangan laporkan) file / folder ini untuk kontrol versi:
Manfaat utama adalah Anda tidak perlu check-in file yang diunduh ke kontrol sumber. Biayanya satu langkah ekstra pada instalasi. Saya pikir itu sepadan.
sumber
gradlew
. @edio Anda akan perlu untuk men-download dan menggunakan spesifik versi Gradle.Apa itu "proyek"?
Mungkin ada definisi teknis dari idiom ini yang mengecualikan skrip membangun. Tetapi jika kami menerima definisi ini, maka kami harus mengatakan "proyek" Anda tidak semua hal yang perlu Anda ubah versi!
Tetapi jika kami mengatakan "proyek Anda" adalah semua yang telah Anda lakukan . Maka kita dapat mengatakan Anda harus memasukkannya dan hanya itu ke dalam VCS.
Ini sangat teoretis dan mungkin tidak praktis jika pengembangan kami berjalan. Jadi kami mengubahnya menjadi " proyek Anda adalah setiap file (atau folder) yang Anda butuhkan untuk mengeditnya secara langsung ".
"secara langsung" berarti "tidak secara tidak langsung" dan "secara tidak langsung" berarti dengan mengedit file lain dan kemudian suatu efek akan tercermin ke dalam file ini .
Jadi kita mencapai hal yang sama seperti yang dikatakan OP (dan dikatakan di sini ):
Iya. Karena Anda belum membuatnya. Jadi mereka bukan bagian dari "proyek Anda" sesuai dengan definisi kedua.
Apa hasil dari file-file ini:
build.gradle : Ya. Kami perlu mengeditnya. Karya kami harus diversi.
Catatan: Tidak ada perbedaan di mana Anda mengeditnya. Baik di lingkungan editor teks Anda atau di lingkungan Struktur Proyek GUI. Pokoknya Anda melakukannya secara langsung !
gradle-wrapper.properties : Ya. Setidaknya kita perlu menentukan versi Gradle dalam file ini.
gradle-wrapper.jar dan gradlew [.bat] : Saya belum membuat atau mengeditnya di salah satu karya pengembangan saya, sampai saat ini! Jadi jawabannya adalah "Tidak". Jika Anda telah melakukannya, jawabannya adalah "Ya" tentang Anda di kantor itu (dan tentang file yang sama yang Anda edit).
Catatan penting tentang kasing terakhir adalah pengguna yang mengkloning repo Anda, perlu menjalankan perintah ini di repo
<root-directory>
untuk menghasilkan berkas pembungkus otomatis :$v
dan$distType
ditentukan dari gradle-wrapper.properties :Lihat https://gradle.org/install/ untuk informasi lebih lanjut.
gradle
executablebin/gradle[.bat]
dalam distribusi lokal. Tidak diperlukan bahwa distribusi lokal sama dengan yang ditentukan dalam repo. Setelah file wrapper dibuat makagradlew[.bat]
dapat mengunduh distribusi Gradle yang ditentukan secara otomatis (jika tidak ada secara lokal). Maka ia mungkin harus membuat ulang file wrapper menggunakangradle
executable baru (dalam distribusi yang diunduh) menggunakan instruksi di atas.Catatan: Dalam instruksi di atas, seharusnya pengguna memiliki setidaknya satu distribusi Gradle secara lokal (mis
~/.gradle/wrapper/dists/gradle-4.10-bin/bg6py687nqv2mbe6e1hdtk57h/gradle-4.10
.). Ini mencakup hampir semua kasus nyata. Tetapi apa yang terjadi jika pengguna belum memiliki distribusi?Ia dapat mengunduhnya secara manual menggunakan URL dalam
.properties
file. Tetapi jika dia tidak menemukannya di jalan yang diharapkan oleh pembungkus , pembungkus akan mengunduhnya lagi! Jalur yang diharapkan benar-benar dapat diprediksi tetapi berada di luar subjek (lihat di sini untuk bagian paling rumit).Ada juga beberapa cara yang lebih mudah (tapi kotor). Sebagai contoh, ia dapat menyalin file pembungkus (kecuali
.properties
file) dari repositori lokal / jauh ke repositori dan kemudian menjalankangradlew
repositori. Secara otomatis akan mengunduh distribusi yang sesuai.sumber
Menurut dokumen Gradle , menambah
gradle-wrapper.jar
VCS diharapkan karena membuat Gradle Wrapper tersedia bagi para pengembang adalah bagian dari pendekatan Gradle:sumber
Pertanyaan lama, jawaban segar. Jika Anda tidak sering memutakhirkan gradle (kebanyakan dari kita tidak), lebih baik komit ke VCS. Dan alasan utama bagi saya adalah untuk meningkatkan kecepatan build di server CI. Saat ini, sebagian besar proyek sedang dibangun dan diinstal oleh server CI, contoh server yang berbeda setiap waktu.
Jika Anda tidak melakukannya, server CI akan mengunduh toples untuk setiap build dan secara signifikan menambah waktu build. Ada cara lain untuk menangani masalah ini, tetapi saya menemukan ini yang paling mudah untuk dijaga.
sumber