วัตถุประสงค์ของ buildscript block ใน Gradle


235

ฉันใหม่กับ Gradle และฉันกำลังอ่านเอกสาร แต่ฉันไม่เข้าใจบางส่วนของมัน หนึ่งในส่วนเหล่านี้เชื่อมต่อกับbuildscriptบล็อก จุดประสงค์ของมันคืออะไร?

หากสคริปต์การสร้างของคุณจำเป็นต้องใช้ไลบรารีภายนอกคุณสามารถเพิ่มพวกเขาไปยัง classpath ของสคริปต์ในสคริปต์การสร้างตัวเอง คุณทำสิ่งนี้โดยใช้วิธี buildscript () ผ่านการปิดซึ่งประกาศ classpath สคริปต์สร้าง

buildscript {
  repositories {
    mavenCentral()
  }
  dependencies {
    classpath group: 'commons-codec', name: 'commons-codec', version: '1.2'
  }
}

ตกลง แต่สิ่งที่แตกต่างคือ:

repositories {
  mavenCentral()
}
dependencies {
  compile group: 'commons-codec', name: 'commons-codec', version: '1.2'
}

ยกตัวอย่างเช่นว่าทำไมมันเป็นสิ่งจำเป็นที่จะใช้งานbuildscript?


1
สำเนาซ้ำของการพึ่งพา
Gradle buildscript

คำตอบ:


178

buildScriptบล็อกกำหนดปลั๊กอินเรียนงานและการเรียนอื่น ๆ ที่มีอยู่สำหรับการใช้งานในส่วนที่เหลือของการสร้างสคริปต์ หากไม่มีbuildScriptบล็อกคุณสามารถใช้ทุกสิ่งที่มาพร้อมกับ Gradle ได้ทันที หากคุณต้องการใช้ปลั๊กอินบุคคลคลาสงานหรือคลาสอื่น ๆ (ในสคริปต์การสร้าง!) คุณต้องระบุการอ้างอิงที่สอดคล้องกันในbuildScriptบล็อก


2
ฉันไม่เข้าใจเอ็ม ฉันเขียนคลาสภารกิจกับกลุ่ม: sample.infotask', name: 'infotask', version: '1.0'และใช้งาน_uploadArchivesเพื่ออัปโหลดไปยัง repo ท้องถิ่น../lib 'ในโครงการอื่นถ้าฉันใช้งานของฉันฉันต้องเขียน: `buildscript {repository {maven {url' file: ../ lib '}} การพึ่งพา {กลุ่มพา ธ คลาส:' sample.infotask ', ชื่อ:' infotask ', รุ่น:' 1.0 '}} ฉันถูกไหม ทำไมเราต้องใช้buildScript block? เมื่อฉันอัปโหลดสิ่งประดิษฐ์ในพื้นที่ฉันมีโถบนเครื่อง และต้องบอก Gradle จากที่ไหนและจะใส่อะไรใน classpath ของฉันไม่มีอะไรพิเศษที่นี่?
Xelian

40
คุณต้องใช้buildScriptบล็อกเพราะ Gradle ต้องการข้อมูลนี้เพื่อทำความเข้าใจสคริปต์การสร้างที่เหลือ นั่นเป็นเหตุผลที่คุณต้องให้ข้อมูลนี้ในช่องทางแยก ( buildScriptบล็อก) เทคนิคการพูด Gradle ต้องการข้อมูลนี้เพื่อรวบรวมและประเมินส่วนที่เหลือของสคริปต์สร้าง สิ่งที่เกิดขึ้นภายใต้ประทุนคือ Gradle แยก build สคริปต์ออกเป็นสองสคริปต์ ( buildScriptบล็อกและทุกอย่างอื่น) เพื่อให้สามารถประมวลผลแยกกันได้
Peter Niederwieser

1
หากคุณอ่านคำตอบนี้หลังจากอ่านคำตอบอื่น ๆ แล้วคุณสามารถเข้าใจสิ่งที่ Peter ต้องการพูด (และค่อนข้างถูกต้อง) แต่บรรทัดที่สอง - "หากไม่มีบล็อก buildScript คุณสามารถใช้ทุกอย่างที่มาพร้อมกับ Gradle out-of-the-box" - เป็นสิ่งที่ทำให้ ans ไม่ชัดเจน
เด็กซ์เตอร์

เพียงบันทึกย่อที่ทำให้ฉันเข้าใจสิ่งทั้งหมด เมื่อใช้ "buildscript" คุณกำลังบอกว่าการพึ่งพาใด ๆ ภายใน buildscript {... } ไม่ได้ถูกใช้โดยโค้ด / โปรแกรม Java / Kotlin (หรือสิ่งที่คุณกำลังใช้) แต่แทนที่จะใช้สคริปต์ gradle เท่านั้น ดังนั้นตัวอย่างเช่นคุณต้องใช้ปลั๊กอินบางตัวที่ไม่ได้จัดเตรียมไว้ตามค่าเริ่มต้นจากนั้นคุณเพิ่มใน buildscript {... } และคุณจะสามารถใช้งานได้กับสคริปต์การไล่ระดับเท่านั้น หวังว่าจะช่วยได้
cesarmax

153
  • รายการระดับโลกdependenciesและrepositoriesส่วนรายการอ้างอิงที่จำเป็นสำหรับการสร้างแหล่งที่มาของคุณและเรียกใช้แหล่งที่มาของคุณเป็นต้น
  • นี่buildscriptคือbuild.gradleไฟล์เอง ดังนั้นสิ่งนี้จะมีการพึ่งพาสำหรับการพูดว่าการสร้าง RPMs Dockerfileและการพึ่งพาอื่น ๆ สำหรับการทำงานในการพึ่งพาทั้งหมดbuild.gradle

4
ส่วนขยายทั้งหมดที่จะไล่ระดับตัวเองพบได้ผ่าน buildscript-> การพึ่งพาซึ่งจะถูกดาวน์โหลดจากส่วน buildscript-> ที่เก็บ buildscript block จะถูกเรียกใช้ก่อน (ขั้นตอนการเตรียมระบบการสร้าง) ก่อนเริ่มการเรียกใช้งานบิลด์เช่นการคอมไพล์ซอร์สเป็นต้น
Raja Nagendra Kumar

4
buildscriptเป็นเพียงการพึ่งพาสำหรับสคริปต์สร้างของคุณ
slier

3
buildscript คือ devDependencies ใน node.js, top-level = dependencies
Jacob

67

ฉันซาบซึ้งกับคำตอบของปีเตอร์ ... แต่มันก็ไม่ชัดเจนสำหรับฉันในทันทีสิ่งที่สคริปต์สร้างส่วนที่เหลือมีความหมายตามที่เน้นในคำตอบและในเอกสารประกอบ

โดยปกติแล้วการใช้ฟังก์ชั่นที่สัมพันธ์กันนั้นมีไว้สำหรับใช้ในโปรแกรม Java หรือโปรแกรมอื่น ๆ ที่คุณอาจจะเขียน การนำใน Spring กล่าวว่าไม่ควรใช้ใน build script แต่ในโปรแกรม Java วางไว้ในการbuildscriptปิดเพื่อให้มั่นใจว่ามีการอ้างอิงสำหรับการใช้งานในการสร้างแบบลาดตัวเอง ไม่ใช่โปรแกรมเอาต์พุต


8

ส่วนการกำหนดค่า "buildscript" มีไว้สำหรับการไล่ระดับตัวเอง (เช่นการเปลี่ยนแปลงวิธีการไล่ระดับสีที่สามารถดำเนินการสร้าง) ดังนั้นส่วนนี้มักจะรวมถึง Android Gradle plugin


2

มันค่อนข้างสูง แต่ก็หวังว่าจะช่วยได้

สำหรับฉันความแตกต่างที่ชัดเจนเริ่มเป็นรูปเป็นร่างเมื่อฉันเริ่มเข้าใจสิ่งที่เป็นองค์ประกอบของอาคารวิธีการและภารกิจ ไวยากรณ์มีลักษณะอย่างไรคุณสามารถกำหนดค่าได้อย่างไรดังนั้นฉันขอแนะนำให้คุณดำเนินการเหล่านี้ทั้งหมด หลังจากนั้นคุณสามารถเริ่มเข้าใจไวยากรณ์นี้

จากนั้นจึงเป็นเรื่องสำคัญมากที่จะต้องทราบว่าวัตถุประเภทใด build.gradle (อินสแตนซ์ของคลาสโปรเจ็กต์) เพื่อทราบว่าคุณมีอะไรได้บ้างในไฟล์ build.gradle ที่จะตอบว่า 'buildScript' และอื่น ๆ มาจากไหน และเพื่อขยายขีดความสามารถ / คุณสมบัติของคุณ (สมมติว่า Android) ดูว่าปลั๊กอินสามารถช่วยได้อย่างไร

ท้ายสุด แต่ไม่ท้ายสุดมีบทแนะนำที่ดีมากที่พูดถึงการปิดผู้เข้าร่วมประชุมซึ่งเป็นแนวคิดที่จำเป็นต่อการทำความเข้าใจสคริปต์


1

คำอธิบายเพิ่มเติมอีกเล็กน้อยโดยแสดงไฟล์ gradle ระดับสูงสุดของ Android

buildscript {
    // this is where we are going to find the libraries defined in "dependencies block" at below
    repositories {
        google()
        jcenter()
        maven { url 'https://dl.bintray.com/kotlin/kotlin-eap' }
    }

    // everything listed in the dependencies is actually a plugin, which we'll do "apply plugin" in our module level gradle file.
    dependencies {
        classpath 'com.android.tools.build:gradle:3.4.2' // this is android gradle plugin
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" // kotlin gradle plugin
    }
}

ไฟล์ gradle ระดับโมดูล

apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'

"ปลั๊กอิน" คืออะไร? พวกเขาเป็นเพียงคลาส Java ซึ่งใช้อินเตอร์เฟซปลั๊กอิน ภายใต้ส่วนต่อประสานมีวิธี "ใช้" เพื่อเพิ่มวัตถุงานหลายรายการที่มีชื่อแตกต่าง Task เป็นคลาสที่เราสามารถใช้เวิร์กโฟลว์ ตัวอย่างเช่นงานบิลด์ประกอบด้วยโฟลว์ของการสร้างแอป

ดังนั้น buildscript ทำอะไร? มันกำหนดที่จะหาปลั๊กอิน ปลั๊กอินทำอะไร มันครอบคลุมงานหลายอย่าง งานทำอะไร มันทำให้เรามีการสร้างติดตั้งผ้าสำลี ฯลฯ

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

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