Gradleスクリプトを別のスクリプトにインポートするにはどうすればよいですか?


97

私は、いくつかのnetbeansプロジェクトのビルドとデプロイに関するさまざまな機能を、さまざまな環境にまとめる複雑なGradleスクリプトを持っています。

スクリプトは非常にうまく機能しますが、本質的には、プロジェクトと環境の情報を保持する6ダースのマップを通じてすべて構成されます。

タスクを別のファイルに抽象化して、単純なビルドファイルでマップを定義し、他のファイルからタスクをインポートできるようにしたいと考えています。このようにして、いくつかのプロジェクトに同じコアタスクを使用して、単純なマップのセットでそれらのプロジェクトを構成できます。

Antのタスクと同様の方法で、1つのGradleファイルを別のGradleファイルにインポートする方法を誰かに教えてもらえますか?私はこれまで、Gradleのドキュメントを利用して何の役にも立ちませんでした。

追加情報

以下のトムの返答の後、私は私が何を意味するのかを正確に明らかにしようとするつもりだと思いました。

基本的に私はいくつかのサブプロジェクトを実行するgradleスクリプトを持っています。ただし、サブプロジェクトはすべてNetbeansプロジェクトであり、独自のantビルドスクリプトが付属しているため、gradleにこれらのそれぞれを呼び出すタスクがあります。

私の問題は、ファイルの先頭に次のような構成があることです。

projects = [
    [name:"MySubproject1", shortname: "sub1", env:"mainEnv", cvs_module="mod1"],
    [name:"MySubproject2", shortname: "sub2", env:"altEnv", cvs_module="mod2"]
]

次に、次のようなタスクを生成します。

projects.each({
    task "checkout_$it.shortname" << {
         // Code to for example check module out from cvs using config from 'it'.
    }
})

私はこれらの種類のタスク生成スニペットの多くを持っています、そしてそれらのすべては一般的です-それらは完全にプロジェクトリストの設定に依存しています。

だから私が欲しいのはこれを別のスクリプトに入れて次のような方法でインポートする方法です:

projects = [
    [name:"MySubproject1", shortname: "sub1", env:"mainEnv", cvs_module="mod1"],
    [name:"MySubproject2", shortname: "sub2", env:"altEnv", cvs_module="mod2"]
]

import("tasks.gradle") // This will import and run the script so that all tasks are generated for the projects given above.

したがって、この例では、tasks.gradleにすべての汎用タスク生成コードが含まれ、メインのbuild.gradleファイルで定義されたプロジェクトに対して実行されます。このように、tasks.gradleは、Netbeans antビルドファイルを含む多数のサブプロジェクトで構成されるすべての大規模プロジェクトで使用できるファイルです。


3
外部宣言をインポートするには、「apply from: 'other.gradle'」構成を検討してください。(「12.4外部ビルドスクリプトを使用して、プロジェクトの設定」を参照してくださいここgradle.org/0.9-preview-1/docs/userguide/...
ペトルGladkikh

@PetrGladkikhはapply fromすぐに外部タスクを実行します。これは実行ロジックでは望ましくない場合があります(つまり、すぐにではなく、必要なときにタスクを実行したい)。
IgorGanapolsky 2016年

上記のコメントでこの文は、真実ではないapply fromすぐに外部のタスクを実行します。誤解を招かないでください。外部タスクは構成され、実行されません。
Jarekczek 2016年

回答:



17

質問への答えは、ディレクトリにあるグルーヴィーなファイルであるプラグインのセットに必要な機能を追加できるプラグインシステムにあることがわかりましたbuildSrc/src/main/groovy。プラグインはJarとしてバンドルすることもできますが、これは試していません。

詳細はこちら:カスタムプラグイン


ちょうどあなたがリンクが壊れている知っているので-ここに更新だgradle.org/docs/current/userguide/...は
JARC

プラグインのリンク:gradle.org/docs/current/userguide/...
JARC

4

さて、実際にビルドファイルを見なくても、何が最も効果的かを判断するのは困難です。

マルチプロジェクトビルドとして環境を準備することで、探している抽象化が提供されると思います。

プロジェクトルートで build.gradleは、ドメイン固有のものすべてと、それに適用されるものを定義しますすべてとすべてのサブプロジェクトに。

repositories {
    add(new org.apache.ivy.plugins.resolver.FileSystemResolver()) {
        name = 'destRepo'
        addIvyPattern( file( project.properties['repo.dest.dir']).absolutePath + '/[organisation]/[module]/ivys/ivy(-[revision]).xml')
        addArtifactPattern( file( project.properties['repo.dest.dir']).absolutePath + '/[organisation]/[module]/[type]s/[artifact](-[revision]).[ext]')
        descriptor = 'optional'
        checkmodified = true
    }
    ...
}
...
subprojects {
    sourceCompatibility = 1.5
    targetCompatibility = 1.5
    group = 'my.group'
    version = '1.0'
    uploadArchives {
        uploadDescriptor = true
        repositories {
            add rootProject.repositories.destRepo
        }
    }
    apply{ type my.group.gradle.api.plugins.MyPlugin }
    ...
}

dependsOnChildren()

プロジェクトのルートディレクトリには、 gradle.properties、プロジェクトで使用されるプロパティを定義するファイルが場合あります。

buildDirName=staging
repo.dest.dir=/var/repo
...

次に、プロジェクトルートの追加ファイルに settings.gradle実際にサブプロジェクトをポイントします。

include 'my-first-component',
        'my-second-component'
...
project(':my-first-component').projectDir = new File(rootDir, 'path/to/first/component')
project(':my-second-component').projectDir = new File(rootDir, 'path/to/second/component')
...

各サブプロジェクトディレクトリにはbuild.gradle、サブプロジェクト固有のもののみを含むファイルが含まれます。

呼び出すかどうかに関係なく gradleプロジェクトルートまたはサブプロジェクトディレクトリのどちらからても、gradleはさまざまなファイルで行われたすべての定義を自動的に考慮します。

また、ルートレベルでデフォルトのプラグイン以外のプラグインをロードしない限り、プロジェクトルートに対してコンパイルタスクが実行されないことにも注意してください。


1
お時間を割いていただきありがとうございます。それは私が問題を抱えているサブプロジェクトではなく、一般的なタスクの「ライブラリ」を作成しています。元の質問を編集して、情報とコードスニペットをよりわかりやすくしました。
Anthony Roy

1
したがって、サンプルからimport( "tasks.gradle")を実行する代わりに、すべてのサブプロジェクトで使用される一般的なタスク生成コードを指定するsubprojects {}セクションがあります。これはあなたが探しているのと同じ抽象化を提供するはずです!?
トム

ここでIvyプラグインは本当に必要ですか?Gradleを単独で使用することはできませんか?
IgorGanapolsky 2016年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.