2

私はまだグルーヴィーを十分に知りません、そしてただ今通り抜けようとしています。現在、次のgradleが機能していますが、もっと簡潔な書き方があるかどうか疑問に思っています。

task staging(type: Sync) {
    from(stagingDir) {}
    into toStagingDir
}

task syncJars(type: Sync) {
    from(configurations.compile) {}
    from(fixedLibDir) {}
    into toStagingLibsDir
}

task copyMainJar(type: Copy) {
    from(libsDir) {}
    into toStagingLibsDir
}

task myZip(type: Zip) {
    archiveName "bacnet.zip"
    from(buildDir) {
        include project.name+'/**'
    }
}

syncJars.dependsOn('staging')
copyMainJar.dependsOn('syncJars')
myZip.dependsOn('copyMainJar')
assemble.dependsOn('myZip')

おそらく、次のように書く方法があります。

task prepareStaging {
    staging from stagingDir into toStagingDir
    syncJars from configurations.compile from fixedLibDir into toStagingLibsDir
    copyMainJar from libsDir into toStagingLibsDir
    myZip archiveName "bacnet.zip" from buildDir { include project.name+'/**' }
}

assemble.dependsOn('prepareStaging')

理想的には、自己文書化コードが大好きです。この2番目の例では、次の開発者にとって、これらの小さなタスクのそれぞれが再利用できないことを意味していることは明らかです。これは非常に明確です(つまり、自己文書化)。最初の方法では、これらのタスクが他のプロジェクトファイルから再利用される可能性があるため、明確ではないコードを記述しました。

その単純な形でそれを書く方法はありますか?

注:私はまだすべての最新のチェックを通常どおりに実行したいと思っています!!!

4

1 に答える 1

1

私が正しく理解していて、toStagingDir(タスク内の)ディレクトリtoStagingLibDirの下に作成された一時的なディレクトリである場合、以下はあなたと同等の仕事をするはずです:buildDirmyZip

task myZip(type: Zip){
  archiveName "bacnet.zip"
  into('staging'){
    from stagingDir
  }
  into('staging/libs'){
    from fixedLibDir
    from configurations.compile
    from libsDir 
    //or this, if you just want to include current projects jars
    from jar.outputs.files
  }
}

ここでの考え方は、一時ディレクトリを自分で作成することではなく、gradleに作成させることです。

電話をかけない限り、cleanMyZip最新のチェックを行い、最低限のことを行います。前回チェックしたときは、ソースに存在しなくなったファイルをzipから削除するという点で、のZipように動作しました。これはタスクとはSync少し異なる動作をする可能性があります。これは、ファイルを削除すると、私の場合はzipから消えますが、コードでは消えないことを意味するタイプであるためです。copyMainJarCopylibsDir

これがあなたが求めているものにさえ近いかどうかはわかりませんが、少なくとも少しは役立つことを願っています:)

詳細:

Gradleのタスクは、設計上AFAIKで常に公開されています。拡張リクエストがありますが、それに関するアクションはあまりありません。プライベートな可視性をサポートする標準のGroovyメソッドを使用できますが、タスクほど強力ではありません。ただし、タスクはGroovy関数など(またはメソッドを使用するもの)に依存する可能性がcall()あるため、次のようなことができます。

def function = {
  println "function here!"
}

task myTask(dependsOn: function) << {
  println "myTask here!"
}

生成されます:

function here!
:a:myTask
myTask here!

これによりある程度の柔軟性が得られるはずですが、本当にプライベートタスクが本当に必要な場合は、ダーティハッキングを行うことができます(Gradleの人たちはこのxxで私を嫌うでしょう;)...ここにあります:

//Create a factory for creating tasks
import org.gradle.api.internal.project.taskfactory.ITaskFactory
def taskFactory = project.services.get(ITaskFactory)

//You can use the factory to create tasks without adding them to
//project.tasks, which will make them invisible to most irrelevant
//parts of your code, and they will not come up in `gradle tasks` list:

//Equivalent of:
// task myTask << {
//   println "i'm invisible"
// }
def privateTask = taskFactory.createTask([name: 'myTask']).doLast {
  println "i'm invisible"
}

//Equivalent of:
// task myCopyTask(type: Copy){
//   from configurations.compile
//   into 'libs'
// }
def privateCopyTask = taskFactory.createTask([name: 'myCopyTask', type: Copy])
                          .configure {
  from configurations.compile
  into 'lib-test'
}

//You can depend on the above tasks as usual from your public tasks:
task publicTask(dependsOn: [privateTask, privateCopyTask]) << {
  println "I'm public task"
}

注:Gradle 1.2で動作するようですが、自己責任で使用してください。

幸運を!

于 2012-10-13T00:33:51.103 に答える