Mục đích của khối xây dựng trong Gradle


235

Tôi mới đến Gradle và tôi đang đọc tài liệu nhưng tôi không hiểu một số phần của nó. Một trong những phần này được kết nối với buildscriptkhối. Mục đích của nó là gì?

Nếu tập lệnh xây dựng của bạn cần sử dụng các thư viện bên ngoài, bạn có thể thêm chúng vào đường dẫn lớp của tập lệnh trong chính tập lệnh xây dựng. Bạn làm điều này bằng cách sử dụng phương thức buildscript (), chuyển qua một bao đóng khai báo đường dẫn tập lệnh xây dựng.

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

Ok nhưng sự khác biệt với:

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

Ví dụ, tại sao cần phải sử dụng buildscript?


1
bản sao có thể có của các phụ thuộc
fejese 17/08/2015

Câu trả lời:


178

Các buildScriptxác định khối mà plugins, các lớp học nhiệm vụ, và các lớp khác có sẵn để sử dụng trong phần còn lại của xây dựng kịch bản . Nếu không có buildScriptkhối, bạn có thể sử dụng mọi thứ đi kèm với Gradle out-of-the-box. Nếu bạn muốn sử dụng bổ sung của bên thứ ba, các lớp nhiệm vụ hoặc các lớp khác (trong tập lệnh xây dựng!), Bạn phải chỉ định các phụ thuộc tương ứng trong buildScriptkhối.


2
Tôi không thể hiểu Em. Tôi đã viết một lớp nhiệm vụ với nhóm: sample.infotask', name: 'infotask', version: '1.0'Và sử dụng tác vụ _uploadArchives để tải nó lên repo cục bộ ../lib ' Trong một dự án khác nếu tôi sử dụng tác vụ của mình, tôi phải viết: `buildscript {kho lưu trữ {maven {url' tệp: ../ lib '}} phụ thuộc {nhóm classpath:' sample.infotask ', tên:' infotask ', phiên bản:' 1.0 '}} Tôi có đúng không? Tại sao chúng ta phải sử dụng khối buildScript ? Khi tôi tải lên tạo tác cục bộ, tôi có bình trên máy. Và chỉ cần nói với Gradle từ đâu và những gì cần đặt trong lớp học của tôi không có gì khác ở đây là gì đặc biệt?
Xelian

40
Bạn phải sử dụng một buildScriptkhối vì Gradle cần thông tin này để hiểu phần còn lại của tập lệnh xây dựng . Đó là lý do tại sao bạn phải cung cấp thông tin này trong một kênh riêng ( buildScriptkhối). Về mặt kỹ thuật, Gradle cần thông tin này để biên dịch và đánh giá phần còn lại của tập lệnh xây dựng. Điều xảy ra dưới mui xe là Gradle tách tập lệnh xây dựng thành hai tập lệnh ( buildScriptkhối và mọi thứ khác) để nó có thể xử lý chúng một cách riêng biệt.
Peter Niederwieser

1
Nếu bạn đọc ans này sau khi đọc các câu trả lời khác, bạn có thể hiểu Peter muốn nói gì (và khá chính xác). Nhưng dòng thứ hai - "Không có khối buildScript, bạn có thể sử dụng mọi thứ đi kèm với Gradle out-of-the-box" - là điều khiến cho ans mơ hồ.
Dexter

chỉ là một ghi chú nhanh khiến tôi hiểu toàn bộ. khi sử dụng "buildscript", bạn đang nói rằng bất kỳ phụ thuộc nào trong buildscript {...} đều không được sử dụng bởi mã / chương trình Java / Kotlin (hoặc bất cứ thứ gì bạn đang sử dụng). Nhưng thay vào đó, chúng CHỈ có nghĩa là được sử dụng bởi các tập lệnh lớp. Vì vậy, ví dụ, bạn cần sử dụng một số plugin không được cung cấp theo mặc định, sau đó bạn thêm nó vào bản dựng {...} và bạn sẽ chỉ có thể sử dụng nó trên các tập lệnh phân lớp. hy vọng nó sẽ giúp
Caesarmax

153
  • Cấp độ toàn cầu dependenciesrepositoriescác phần liệt kê các phụ thuộc cần thiết để xây dựng nguồn của bạn và chạy nguồn của bạn, v.v.
  • Đây buildscriptlà cho các build.gradletập tin chính nó. Vì vậy, điều này sẽ chứa các phụ thuộc để nói rằng tạo RPM Dockerfilevà bất kỳ phụ thuộc nào khác để chạy các tác vụ trong tất cả các phụ thuộcbuild.gradle

4
Tất cả các phần mở rộng để tự phân lớp được tìm thấy thông qua buildscript-> phụ thuộc, lần lượt được tải xuống từ phần buildscript-> kho. khối bản dựng, được chạy trước (giai đoạn chuẩn bị hệ thống) trước khi bắt đầu thực hiện tác vụ xây dựng, chẳng hạn như biên dịch nguồn, v.v.
Raja Nagendra Kumar

4
buildscriptchỉ đơn giản là phụ thuộc vào tập lệnh xây dựng của bạn
slier

3
buildscript là devDependencies trong node.js, top-level = phụ thuộc.
Jacob

67

Tôi đánh giá cao câu trả lời của Peter ... nhưng đối với tôi , phần còn lại của kịch bản xây dựng không có ý nghĩa như được nhấn mạnh trong câu trả lời và trong tài liệu.

Thông thường mang đến chức năng phụ thuộc là để sử dụng trong chương trình Java hoặc bất kỳ chương trình nào khác mà bạn có thể đang viết. Mang trong Spring nói, không được sử dụng trong tập lệnh xây dựng, mà trong chương trình Java. Đặt nó trong bao buildscriptđóng đảm bảo rằng các phụ thuộc có sẵn để sử dụng trong chính lớp xây dựng. Không phải chương trình đầu ra.


8

Phần cấu hình "bản dựng" dành cho bản thân lớp (tức là thay đổi cách thức lớp có thể thực hiện bản dựng). Vì vậy, phần này thường sẽ bao gồm plugin Android Gradle.


2

Đó là một mức độ cao nhưng hy vọng sẽ giúp.

Đối với tôi, sự khác biệt rõ ràng bắt đầu hình thành khi tôi bắt đầu hiểu thế nào là khối xây dựng , phương pháp và nhiệm vụ. Cú pháp trông như thế nào, làm thế nào bạn có thể cấu hình chúng, v.v. Vì vậy, tôi khuyên bạn nên xem qua tất cả những điều này. Sau đó, bạn có thể bắt đầu hiểu ý nghĩa của cú pháp này.

Sau đó, điều rất quan trọng là phải biết loại của đối tượng build.gradle (một thể hiện của lớp Project) để biết bạn có thể có gì trong tệp build.gradle. Điều đó sẽ trả lời rằng 'buildScript' và những người khác đến từ đâu. Và để mở rộng khả năng / tính năng của bạn (giả sử Android), hãy xem cách các plugin có thể trợ giúp.

Cuối cùng nhưng không kém phần quan trọng, có một hướng dẫn rất hay ở đây nói về việc đóng cửa, các đại biểu là những khái niệm cần thiết để hiểu kịch bản.


1

Giải thích thêm một chút bằng cách chứng minh tập tin cấp độ cao nhất của 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
    }
}

tập tin cấp độ mô-đun

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

"Plugin" là gì? Chúng chỉ là các lớp java, thực hiện giao diện Plugin. Trong giao diện, nó có một phương thức "áp dụng" để thêm nhiều đối tượng tác vụ với các tên khác nhau. Nhiệm vụ là một lớp nơi chúng ta có thể thực hiện quy trình công việc. Chẳng hạn, tác vụ xây dựng bao gồm dòng chảy xây dựng ứng dụng.

Vì vậy, bản dựng làm gì? Nó xác định nơi để tìm các plugin. Plugin làm gì? Nó bao gồm nhiều nhiệm vụ. Nhiệm vụ làm gì? Nó cung cấp cho chúng tôi bản dựng, cài đặt, lint, v.v.

Sự hiểu biết của tôi có thể sai. Xin đừng ngần ngại sửa tôi nếu bạn thấy bất cứ điều gì là sai lệch.

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.