จะสร้างไฟล์ wrapper Gradle ได้อย่างไร / เมื่อไหร่?


212

ฉันพยายามที่จะเข้าใจว่า Gradle Wrapper ทำงานอย่างไร ใน repos หลายแหล่งฉันเห็นโครงสร้างต่อไปนี้:

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

คำถามของฉัน:

  1. วิธีการหนึ่ง / เมื่อสร้างgradlew/gradlew.bat ? คุณควรจะสร้างมันขึ้นมาเพียงครั้งเดียวเมื่อสร้างโปรเจ็กต์ครั้งแรกคุณสร้างมันขึ้นมาทุกครั้งที่คุณยอมรับ / ผลักดันการเปลี่ยนแปลงหรือไม่? และพวกเขาสร้างอย่างไร
  2. คำถามเดียวกันข้างต้น แต่สำหรับgradle/wrapper/*ไฟล์ ( gradle-wrapper.jarและgradle-wrapper.properties )?
  3. บางครั้งฉันก็เห็น*.gradleไฟล์อื่น ๆในโครงการgradleไดเรกทอรีไฟล์ Gradle เพิ่มเติมเหล่านี้คืออะไรและพวกมันเป็นตัวแทน / ทำอะไร? ปลั๊กอินที่กำหนดเอง?
  4. อะไรคือความแตกต่างของคุณสมบัติที่ไปsettings.gradleเทียบกับสิ่งที่ควรกำหนดไว้ภายในgradle.properties?

คำตอบ:


251
  1. คุณสร้างมันหนึ่งครั้งและอีกครั้งเมื่อคุณต้องการเปลี่ยนเวอร์ชั่นของ Gradle ที่คุณใช้ในโครงการ ไม่จำเป็นต้องสร้างบ่อยนัก นี่คือเอกสาร เพียงเพิ่มwrapperงานลงในbuild.gradleไฟล์และเรียกใช้งานนี้เพื่อรับโครงสร้างตัวตัด

    โปรดทราบว่าคุณต้องติดตั้ง Gradleเพื่อสร้างกระดาษห่อ เครื่องมือที่ยอดเยี่ยมสำหรับการจัดการสิ่งประดิษฐ์ระบบนิเวศคือSDKMAN! . ในการสร้าง wrapper gradle ให้เพิ่มโค้ดต่อไปนี้ลงในbuild.gradleไฟล์:

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

    และเรียกใช้:

    gradle wrapper
    

    งาน. เพิ่มไฟล์ผลลัพธ์ลงใน SCM (เช่น git) และจากนี้นักพัฒนาทั้งหมดจะมี Gradle รุ่นเดียวกันเมื่อใช้ Gradle Wrapper

    ด้วย Gradle 2.4 (หรือสูงกว่า) คุณสามารถตั้งค่า wrapper โดยไม่ต้องเพิ่มงานเฉพาะ:

    gradle wrapper --gradle-version 2.3
    

    หรือ

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

    รายละเอียดทั้งหมดสามารถดูได้ที่นี่

จาก3.1 --distribution-typeตัวเลือกGradle ยังสามารถใช้ ตัวเลือกที่มีไบนารีและทั้งหมดและถัง ทั้งหมดมีรหัสแหล่งที่มาและเอกสารเพิ่มเติม ทั้งหมดยังดีกว่าเมื่อใช้ IDE ดังนั้นตัวแก้ไขจึงทำงานได้ดีขึ้น ข้อเสียคือการสร้างอาจนานกว่านี้ (จำเป็นต้องดาวน์โหลดข้อมูลเพิ่มเติมไม่มีจุดหมายบนเซิร์ฟเวอร์ CI) และจะใช้พื้นที่มากขึ้น

  1. นี่คือไฟล์ Gradle Wrapper คุณต้องสร้างมันขึ้นมาหนึ่งครั้ง (สำหรับรุ่นใดรุ่นหนึ่ง) และเพิ่มลงในการควบคุมเวอร์ชัน หากคุณต้องการเปลี่ยนเวอร์ชั่นของ Gradle Wrapper ให้เปลี่ยนเวอร์ชั่นในbuild.gradleดู (1) และสร้างไฟล์ใหม่

  2. ยกตัวอย่างรายละเอียด ไฟล์ดังกล่าวอาจมีหลายวัตถุประสงค์: โครงการหลายโมดูลแยกความรับผิดชอบสคริปต์แก้ไขเล็กน้อย ฯลฯ

  3. settings.gradleรับผิดชอบต่อโครงสร้างของโครงการ (โมดูลชื่อ ฯลฯ ) ในขณะที่gradle.propertiesใช้สำหรับรายละเอียดภายนอกของโครงการและ Gradle (เวอร์ชันอาร์กิวเมนต์บรรทัดคำสั่ง-XXคุณสมบัติ ฯลฯ )


ขอบคุณ @Opal (+1) - เพื่อให้คุณมีตัวอย่างที่เฉพาะเจาะจงสำหรับ # 3 ดูNetflix-Eureka ไฟล์ Gradle เหล่านี้คืออะไร?
smeeb

ตกลงฉันเห็นแล้ว เท่าที่ฉันเห็นนักพัฒนาจาก Netflix เพิ่งแบ่งbuild.gradleสคริปต์ใหญ่หนึ่งรายการให้สั้นลงหลายรายการและอุทิศให้กับสคริปต์วัตถุประสงค์เฉพาะหนึ่งรายการ ในฐานะที่คุณสามารถสคริปต์ที่อยู่ภายใต้gradle dir นำไปใช้กับหลักbuild.gradleไฟล์มุมมอง: github.com/Netflix/eureka/blob/master/build.gradle ที่คุณวางโมดูลดังกล่าวเป็นที่คุณเลือก นั่นคือทั้งหมดที่โดยทั่วไป หากคุณพอใจกับคำตอบโปรดยอมรับคำตอบ :)
โอปอล

1
อีกตัวเลือกหนึ่งที่มีประโยชน์บรรทัดคำสั่งเป็น--distribution-typeเช่นgradle wrapper --gradle-version 4.3.1 --distribution-type ALL
heenenee

1
ขอบคุณ @heenenee จะเพิ่มไปยังคำตอบของฉัน
โอปอล

เคล็ดลับ: Android Studio มี Gradle ในโฟลเดอร์การติดตั้ง
TWiStErRob

29

การสร้าง Wrapper Gradle

โครงการสร้าง 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()
    }
}

จากนั้นที่รันบรรทัดคำสั่ง

gradle wrapper

หากคุณไม่มี gradle ในระบบของคุณให้ติดตั้งไม่เช่นนั้นข้างต้นจะไม่ทำงาน บน Mac ที่ดีที่สุดคือการติดตั้งผ่าน Homebrew

brew install gradle

หลังจากคุณรันงาน wrapper และสร้างสำเร็จgradlewแล้วอย่าใช้ระบบ gradle ของคุณ มันจะช่วยให้คุณปวดหัวมาก

./gradlew assemble

ปลั๊กอิน gradle ที่เห็นด้านบนเป็นอย่างไร?

com.android.tools.build:gradle:1.0.1

คุณควรตั้งค่าเวอร์ชันให้เป็นรุ่นล่าสุดและคุณสามารถตรวจสอบหน้าเครื่องมือและแก้ไขเวอร์ชันได้

ดูว่า Android Studio สร้างอะไร

การเพิ่มระดับความลาดชันและ Android Studio รุ่นใหม่ล่าสุดได้เปลี่ยนเค้าโครงโครงการอย่างมาก หากคุณมีโครงการเก่าฉันขอแนะนำให้สร้างโครงการใหม่ด้วย Android Studio ล่าสุดและดูว่า Google พิจารณาโครงการมาตรฐานอย่างไร

Android Studio มีสิ่งอำนวยความสะดวกสำหรับการนำเข้าโครงการเก่าซึ่งสามารถช่วยเหลือได้เช่นกัน


gradleVersion = '2.2'ในtaskWrapperสามารถใช้รุ่นใดก็ได้ที่ฉันต้องการในการสร้างเสื้อคลุมใช่ไหม? ไม่จำเป็นต้องเป็นรุ่นล่าสุดของ gradle หรือไม่?
raffian

1
ฉันคิดว่าคุณสามารถย้อนกลับไปในระดับ 2 ชุด ฉันไม่แน่ใจเกี่ยวกับก่อน 2.x แต่ไม่จำเป็นต้องทำตามรุ่นล่าสุดแน่นอน
Cameron Lowell Palmer

18

ตั้งแต่ Gradle 2.4 คุณสามารถใช้gradle wrapper --gradle-version X.Xเพื่อกำหนดรุ่นเฉพาะของ Gradle wrapper โดยไม่ต้องเพิ่มงานใด ๆ ลงในbuild.gradleไฟล์ของคุณ ครั้งต่อไปที่คุณใช้กระดาษห่อมันจะดาวน์โหลดการกระจาย Gradle ที่เหมาะสมเพื่อให้ตรงกับ


10

หากคุณต้องการดาวน์โหลด gradle กับแหล่งที่มาและเอกสาร URL กระจายเริ่มต้นการกำหนดค่าใน gradle-wrapper.properites จะไม่ตอบสนองความ need.It ของคุณhttps://services.gradle.org/distributions/gradle-2.10-bin.zip , ไม่https://services.gradle.org/distribution/gradle-2.10-all.zip URL แบบเต็มนี้ได้รับการแนะนำโดย IDE เช่น Android Studio หากคุณต้องการดาวน์โหลด gradle แบบเต็มคุณสามารถกำหนดค่างาน wrapper เช่นนี้ได้ :

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

1
ด้วยบิวด์ล่าสุดของ gradle (ไม่แน่ใจว่าอันไหน) - แทนที่จะเขียน url ใหม่ด้วยตนเองก็น่าจะดีที่สุดที่จะใช้คำสั่ง inbuilt ในการปิดแบบเดียวกัน: distributionType = Wrapper.DistributionType.ALL
Dave Birch

6

นี่คือคำสั่งที่จะใช้บอก Gradle เพื่ออัพเกรด wrapper ซึ่งมันจะคว้าเวอร์ชั่นการแจกจ่ายของไลบรารี่ที่มี source code:

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

การระบุประเภทการแจกจ่ายด้วย "ทั้งหมด" จะทำให้แน่ใจว่า Gradle ดาวน์โหลดไฟล์ต้นฉบับเพื่อใช้ในสภาพแวดล้อมการพัฒนาของคุณ

ข้อดี :

  • IDE จะเข้าถึงรหัสต้นฉบับได้ทันที ตัวอย่างเช่น Intellij IDEA จะไม่แจ้งให้คุณอัปเดตสคริปต์สำหรับสร้างเพื่อรวม distro ต้นทาง (เนื่องจากคำสั่งนี้ทำเช่นนั้น)

ข้อเสีย :

  • กระบวนการสร้างอีกต่อไป / ใหญ่ขึ้นเพราะมันกำลังดาวน์โหลดซอร์สโค้ด นี่เป็นการเสียเวลา / พื้นที่ว่างบนบิลด์หรือเซิร์ฟเวอร์ CI ซึ่งไม่จำเป็นต้องใช้ซอร์สโค้ด

กรุณาแสดงความคิดเห็นหรือให้คำตอบอื่นถ้าคุณรู้ว่าตัวเลือกบรรทัดคำสั่งใด ๆ เพื่อบอก Gradle ไม่ให้ดาวน์โหลดแหล่งข้อมูลบนบิลด์เซิร์ฟเวอร์


1
คุณแน่ใจหรือว่าการตั้งค่านี้เกี่ยวกับห้องสมุด เอกสารอย่างเป็นทางการพูดเป็นอย่างอื่นและอ้างถึงเสื้อคลุมเท่านั้น: "ประเภทของการกระจาย Gradle ที่จะใช้โดยเสื้อคลุม" docs.gradle.org/current/dsl/…
Thorsten Schöning

2
  1. คุณจะสร้างมันขึ้นมาหนึ่งครั้ง แต่อัพเดทมันถ้าคุณต้องการฟีเจอร์ใหม่หรือบางอย่างจากปลั๊กอินซึ่งจำเป็นต้องมีเวอร์ชั่นที่ใหม่กว่า

    วิธีที่ง่ายที่สุดในการอัปเดต: ตั้งแต่ Gradle 2.2 คุณสามารถดาวน์โหลดและแยกการกระจาย Gradle ที่สมบูรณ์หรือไบนารีแล้วเรียกใช้:

    $ <pathToExpandedZip>/bin/gradle wrapper
    

    ไม่จำเป็นต้องกำหนดภารกิจแม้ว่าคุณอาจต้องการbuild.gradleไฟล์บางประเภท

    การทำเช่นนี้จะเป็นการอัปเดตหรือสร้างgradlewและgradlew.batห่อหุ้มรวมถึงgradle/wrapper/gradle-wrapper.propertiesและgradle-wrapper.jarเพื่อให้รุ่นปัจจุบันของการไล่ระดับ

  2. นั่นเป็นส่วนหนึ่งของเสื้อคลุม

  3. บางbuild.gradleไฟล์อ้างอิงไฟล์หรือไฟล์อื่น ๆ ในไดเรกทอรีย่อยซึ่งเป็นโครงการย่อยหรือโมดูล มันซับซ้อนเล็กน้อย แต่ถ้าคุณมีโครงการหนึ่งคุณต้องใช้ไฟล์เดียว

  4. settings.gradleจัดการโครงการโมดูลและชื่อและการตั้งค่าประเภทอื่น ๆgradle.propertiesกำหนดค่าตัวแปรที่สามารถใช้ซ้ำได้สำหรับไฟล์ gradle ของคุณหากคุณต้องการและคุณรู้สึกว่าพวกเขาจะชัดเจนกว่าเช่นนั้น


2

เนื่องจากภารกิจในตัวของการไล่ระดับสีถูกคัดค้านใน 4.8 ลองด้านล่าง

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

และเรียกใช้

gradle wrapper
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.