Gradleのbuildscriptブロックの目的


236

私はGradleを初めて使用し、ドキュメントを読んでいますが、その一部が理解できません。これらの部品の1つがbuildscriptブロックに接続されています。その目的は何ですか?

ビルドスクリプトで外部ライブラリを使用する必要がある場合は、それらをビルドスクリプト自体のスクリプトのクラスパスに追加できます。これを行うには、buildscript()メソッドを使用して、ビルドスクリプトのクラスパスを宣言するクロージャを渡します。

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ですか?


回答:


178

buildScriptブロックは、での使用のために利用可能なプラグイン、タスククラス、および他のクラスを決定するビルドスクリプトの残りの部分buildScriptブロックがなければ、Gradleに付属しているすべてのものをそのまま使用できます。サードパーティのプラグイン、タスククラス、またはその他のクラス(ビルドスクリプト内)をさらに使用する場合は、buildScriptブロックで対応する依存関係を指定する必要があります。


2
エムが理解できません。私は、タスククラスを書いた:グループsample.infotask', name: 'infotask', version: '1.0'と使用_uploadArchivesのローカルレポにそれをアップロードするタスク「../libファイル: `buildscript {リポジトリ{Mavenの{URLを私は自分のタスクを使用する場合、私が書く必要があります別のプロジェクトで」../ lib '}}依存関係{クラスパスグループ:' sample.infotask '、名前:' infotask '、バージョン:' 1.0 '}}私は正しいですか?buildScriptブロックを使用する必要があるのはなぜですか?アーティファクトをローカルにアップロードすると、自分のマシンにjarがあります。そして、Gradleにクラスパスのどこから何を配置するかを指示するだけで、ここで何が特別なのでしょうか?
Xelian 2013

40
buildScriptGradleは、残りのビルドスクリプト理解するためにこの情報を必要とするため、ブロックを使用する必要があります。そのため、この情報を別のチャネル(buildScriptブロック)で提供する必要があります。技術的には、Gradle は残りのビルドスクリプトをコンパイルして評価するためにこの情報を必要とします。内部では、Gradleはビルドスクリプトを2つのスクリプト(buildScriptブロックとその他すべて)に分離し、それらを個別に処理できるようにします。
Peter Niederwieser 2013

1
他の答えを読んだ後にこのansを読むと、ピーターが言いたいことを理解できます(そして、それはかなり正しいです)。しかし、2行目-「buildScriptブロックがなくても、Gradleに同梱されているすべてのものをすぐに使用できます」が、ansをあいまいにします。
デクスター

全体を理解させてくれたちょっとしたメモ。「buildscript」を使用するときは、buildscript {...}内の依存関係がJava / Kotlinコード/プログラム(または使用しているもの)によって使用されていないことを示しています。ただし、代わりに、gradleスクリプトで使用することのみを目的としています。したがって、たとえば、デフォルトで提供されていないプラグインを使用する必要がある場合は、それをbuildscript {...}に追加すると、gradleスクリプトでのみ使用できるようになります。お役に立てば幸い
cesarmax

153
  • グローバルレベルdependenciesrepositoriesセクションには、ソースのビルドやソースの実行などに必要な依存関係がリストされています。
  • これbuildscriptbuild.gradleファイル自体です。したがって、これには、RPMの作成Dockerfileなどの依存関係と、すべての依存関係でタスクを実行するためのその他の依存関係が含まれますbuild.gradle

4
Gradle自体へのすべての拡張機能は、buildscript->依存関係によって見つかります。依存関係は、buildscript->リポジトリセクションからダウンロードされます。buildscriptブロック、そのようなソースコンパイル等のビルドタスクの実行を開始する前に(ビルドシステム準備フェーズ)最初に実行されている
のRaja Nagendraクマー

4
buildscriptビルドスクリプトの単純な依存関係です
18年

3
buildscriptはnode.jsのdevDependencies、トップレベル=依存関係です。
ジェイコブ

67

ピーターの答えに感謝します...しかし、残りのビルドスクリプトが答えとドキュメントで強調されている意味がすぐにわかりませんでした

通常、依存する機能を組み込むのは、Javaプログラムまたは他のプログラムで使用するためです。Springの導入は、ビルドスクリプトではなく、Javaプログラムで使用されるということです。これをbuildscriptクロージャーに入れると、gradleビルド自体で依存関係を使用できるようになります。出力プログラムではありません。


8

「buildscript」構成セクションは、gradle自体用です(つまり、gradleがビルドを実行する方法の変更)。したがって、このセクションには通常、Android Gradleプラグインが含まれます。


2

それは少し高いレベルですが、希望は役立ちます。

私にとって、ビルディングブロック、メソッド、タスクとは何かを理解し始めると、明確な区別が形成され始めました。構文がどのように見えるか、それらをどのように構成できるかなどです。したがって、これらすべてを検討することをお勧めします。その後、この構文を理解することができます。

次に、オブジェクトbuild.gradle(Projectクラスのインスタンス)のタイプを知って、build.gradleファイル内に何を含めることができるかを知ることが非常に重要です。それは、その「buildScript」などがどこから来たのかを答えます。また、機能/機能(Androidなど)を拡張するには、プラグインがどのように役立つかを確認してください。

最後に重要なことですが、ここには、スクリプトを理解するために不可欠な概念であるクロージャー、デリゲートについて説明する非常に優れたチュートリアルがあります。


1

Androidの最上位のGradleファイルをデモンストレーションして、もう少し説明します。

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クラスです。インターフェースの下には、異なる名前の複数のタスクオブジェクトを追加するメソッド「apply」があります。タスクは、ワークフローを実装できるクラスです。たとえば、ビルドタスクはアプリをビルドするフローで構成されます。

では、buildscriptは何をするのでしょうか。プラグインを見つける場所を定義します。プラグインは何をしますか?複数のタスクが含まれます。タスクは何をしますか?ビルド、インストール、リントなどを提供します。

私の理解は間違っているかもしれません。誤解を招くようなものがあれば、遠慮なく訂正してください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.