web-dev-qa-db-ja.com

build.gradleでカスタムメソッドを定義して呼び出す方法

プロジェクトの一環として、ディレクトリからファイルを読み取り、ビルドスクリプトでこれらすべての操作を行う必要があります。各ファイルの操作は同じです(いくつかのSQLクエリを読み取り、実行します)。私はそれが反復的な仕事であり、メソッド内に記述する方が良いと思います。私はgradleが初めてなので、それがどうあるべきかわかりません。助けてください。

62
Tomin

以下に示す1つのアプローチ:

ext.myMethod = { param1, param2 ->
    // Method body here
}

これは、プロジェクトスコープに対して作成されることに注意してください。プロジェクトでグローバルに利用可能。myMethod(p1, p2)と同等のproject.myMethod(p1, p2)を使用して、ビルドスクリプトのどこからでも次のように呼び出すことができます。

メソッドは、タスク内など、さまざまなスコープで定義することもできます。

task myTask {
    ext.myMethod = { param1, param2 ->
        // Method body here
    }

    doLast {
        myMethod(p1, p2) // This will resolve 'myMethod' defined in task
    }
}
84
Invisible Arrow

他のファイル* .gradleでメソッドを定義している場合-ext.method()はプロジェクト全体でアクセス可能にします。たとえば、ここに

versioning.gradle

// ext makes method callable project wide
ext.getVersionName = { ->
    try {
        def branchout = new ByteArrayOutputStream()
        exec {
            commandLine 'git', 'rev-parse', '--abbrev-ref', 'HEAD'
            standardOutput = branchout
        }
        def branch = branchout.toString().trim()

        if (branch.equals("master")) {
            def stdout = new ByteArrayOutputStream()
            exec {
                commandLine 'git', 'describe', '--tags'
                standardOutput = stdout
            }
            return stdout.toString().trim()
        } else {
            return branch;
        }
    }
    catch (ignored) {
        return null;
    }
}

build.gradle

task showVersion << {
    // Use inherited method
    println 'VersionName: ' + getVersionName()
}

Ext.method()formatがない場合、メソッドは宣言された* .gradleファイル内でのみ使用可能になります。これはプロパティでも同じです。

23
Rowland Mtetezi

次の方法でメソッドを定義できます。

// Define an extra property
ext.srcDirName = 'src/Java'

// Define a method
def getSrcDir(project) {
    return project.file(srcDirName)
}

詳細については、gradleのドキュメントを参照してください 第62章ビルドロジックの整理

22
Ivan Marinov

メソッドを含むルートオブジェクトの例。

hg.gradleファイル:

ext.hg = [

    cloneOrPull: { source, dest, branch ->
        if (!dest.isDirectory())
            hg.clone(source, dest, branch)
        else
            hg.pull(dest)
        hg.update(dest, branch)
    },

    clone: { source, dest, branch ->
        dest.mkdirs()
        exec {
            commandLine 'hg', 'clone', '--noupdate', source, dest.absolutePath
        }
    },

    pull: { dest ->
        exec {
            workingDir dest.absolutePath
            commandLine 'hg', 'pull'
        }
    },

]

build.gradleファイル

apply from: 'hg.gradle'

hg.clone('path/to/repo')
10
Kevin Struillou