6

私はGradleについて読んでいて、特に、ビルドプロセスに継承を導入できるようになっているため、非常に興味があります。たとえば、AmazonEC2インスタンスだけでなくGoogleAppEngineインスタンスにパッケージ化してデプロイできるJavaWebアプリがある場合、同じJava、XML、PROPERTIES、CSS、およびイメージファイルとパッケージを使用できる高度なビルドが必要です。 /それらを2つの大幅にパッケージ化されたファイルにデプロイしWARます。

GAEアプリは、パッケージ化の方法に関して非常に具体的です。EC2(ほとんど)では、サーブレットの仕様に準拠している必要があります。GAEアプリは、SDKに付属updateのスクリプトからコマンドを実行することで「デプロイ」されます。appcfg.shEC2には、アプリをデプロイする独自の方法があります。重要なのは、これらは両方のPaaSプロバイダーにとって非常に異なるパッケージ化/展開プロセスであるということです。

public abstract class PackageTask {
    // ...
}

// Package my Eclipse project for deployment to GAE.
public class AppEnginePackageTask extends PackageTask {
    // ...
}

// Package my Eclipse project for deployment to EC2 instances.
public class AmazonPackageTask extends PackageTask {
    // ...
}

public abstract class DeployTask {
    // ...
}

// Deployment to GAE.
public class AppEngineDeployTask extends DeployTask {
    // ...
}

// Deployment to EC2.
public class AmazonDeployTask extends DeployTask {
    // ...
}

次に、myapp.gradleタスクのビルド順序をテンプレート化するビルドファイルがある場合があります。

clean()
compile()
package()
deploy()

...そしてどういうわけか、GAEベースのビルドの/の代わりに/を構成/注入するか、AppEnginePackageTaskそれらAppEngineDeployTaskpackage()テンプレート化されたタスクに/を構成/注入することができます。繰り返しになりますが、これを行う方法はわかりません(または、Gradleがこれを行うことができる場合でも)が、それが私が求めていることです。deploy()AmazonPackageTaskAmazoneDeployTask

私の理解では、Gradleはこれを実行できます。Antは、このように機能する高度にモジュール化されたエレガントなビルドを強制することもできますが、XMLベースであるため、多少の調整が必要ですが、GroovyのようなOOPベースの言語はこれをよりクリーンでシンプルにします。

ただし、Gradleタスクのすべての例は、次の形式を取ります。

task package(dependsOn: 'compile') {
    // ...
}

task deploy(dependsOn: 'package') {
    // ...
}

だから私は尋ねます:これらは非OOPタスク定義のように見えます。Gradle(およびそのOOPの性質)についての私の理解は根本的に間違っていますか?ここで何が欠けていますか?これらの「構成可能/注入可能なビルドテンプレート」および継承ベースのタスクの概念をどのように実現できますか?前もって感謝します!

編集私はこの質問に「groovy」のタグを付け直しました。GradleビルドスクリプトはGroovyDSLで記述されており、Groovyの第一人者(5倍速いと言う)でも、ほとんど知らなくてもチャイムを鳴らすことができるかもしれません。 Gradle。

4

1 に答える 1

3

ここで説明するように単純なタスクと拡張されたタスクがあります。後者ははるかに柔軟で強力です。

次の例は、re:injectionの説明とは異なりますが、OOPを示しています。

これがサンプルのbuild.gradleファイルです。Java / Groovyのキーワードであるため、「パッケージ」を回避します。「build」ターゲットは、「pkgTarget」と呼ばれるプロパティに応じて、「compile」と「doPack」のフレーバーに依存します。

task compile << { 
    println "compiling..." 
}

task build() << {
}

build.dependsOn { 
    compile
}

build.dependsOn { 

    if (pkgTarget == "Amazon") {
        task doPack(type: AmazonPackageTask)
    } else if (pkgTarget == "Google") {
        task doPack(type: GooglePackageTask)
    } else {
        task doPack(type: MyPackageTask) 
    }
}

ここで、タスクは後で同じファイルで定義されます。(ドキュメントごとに、このコードは「buildsrc」ディレクトリに入れることができます):

// ----- 

class MyPackageTask extends DefaultTask {
    def init() { println 'common stuff' }
    @TaskAction
    def doPackage() {
        println 'hello from MyPackageTask'
    }
}

class AmazonPackageTask extends MyPackageTask {
    @TaskAction
    def doPackage() {
        init()
        println 'hello from AmazonPackageTask'
    }
}

class GooglePackageTask extends MyPackageTask {
    @TaskAction
    def doPackage() {
        init()
        println 'hello from GooglePackageTask'
    }
}

そしてここにgradle.propertiesファイルがあります:

pkgTarget=Amazon
于 2012-09-09T18:21:48.053 に答える