2013-04-22 10 views
22

パスを設定できるファイルシステムで依存性の解決を処理するカスタムGradleタスクを書きました。このタイプのタスクを常に実行したい。入力は一度も変わらないように見えるので、一度しか実行されませんが、私は推測しています。Gradle:強制的にカスタムタスクを常に実行する(キャッシュなし)

私はconfigurations { resolutionStrategy.cacheChangingModulesFor 0, 'seconds' }を使用してキャッシュを効果的に無効にすることに気付いていますが、私はそれを非常に特定のタスクに適用したいだけです。また、類似している--rerun-tasksコマンドラインプロンプトも認識しています。どちらも最高の解決策ではないと感じているのではなく、カスタムタスク定義でこれを正しく設定する方法が必要です。

これは私の現在の実装です。私はまた、最初の3つのdef String文が@Input注釈付きのString宣言であった以前のバージョンを持っていました。

class ResolveProjectArchiveDependency extends DefaultTask { 
    def String archiveFilename = "" 
    def String relativeArchivePath = "" 
    def String dependencyScope = "" 

    @OutputFile 
    File outputFile 

    @TaskAction 
    void resolveArtifact() { 
     def arcFile = project.file("dependencies/"+dependencyScope+"/"+archiveFilename) 
     def newArcFile = "" 

     if(project.hasProperty('environmentSeparated') && project.hasProperty('separatedDependencyRoot')){ 
      println "Properties set denoting the prerelease environment is separated" 
      newArcFile = project.file(project.ext.separatedDependencyRoot+relativeArchivePath+archiveFilename) 
     } else { 
      newArcFile = project.file('../../'+relativeArchivePath+archiveFilename) 
     } 

     if(!newArcFile.isFile()){ 
      println "Warn: Could not find the latest copy of " + archiveFilename + ".." 

      if(!arcFile.isFile()) { 
       println "Error: No version of " + archiveFilename + " can be found" 
       throw new StopExecutionException(archiveFilename +" missing") 
      } 
     } 

     if(!arcFile.isFile()) { 
      println archiveFilename + " jar not in dependencies, pulling from archives" 
     } else { 
      println archiveFilename + " jar in dependencies. Checking for staleness" 

      def oldHash = generateMD5(new File(arcFile.path)) 
      def newHash = generateMD5(new File(newArcFile.path)) 

      if(newHash.equals(oldHash)) { 
       println "Hashes for the jars match. Not pulling in a copy" 
       return 
      } 
     } 

     //Copy the archive 
     project.copy { 
      println "Copying " + archiveFilename 
      from newArcFile 
      into "dependencies/"+dependencyScope 
     } 
    } 

    def generateMD5(final file) { 
     MessageDigest digest = MessageDigest.getInstance("MD5") 
     file.withInputStream(){is-> 
     byte[] buffer = new byte[8192] 
     int read = 0 
      while((read = is.read(buffer)) > 0) { 
       digest.update(buffer, 0, read); 
      } 
     } 
     byte[] md5sum = digest.digest() 
     BigInteger bigInt = new BigInteger(1, md5sum) 
     return bigInt.toString(16) 
    } 
} 

ここでのタスクの使用方法の例です:

task handleManagementArchive (type: com.moremagic.ResolveProjectArchiveDependency) { 
    archiveFilename = 'management.jar' 
    relativeArchivePath = 'management/dist/' 
    dependencyScope = 'compile/archive' 
    outputFile = file('dependencies/'+dependencyScope+'/'+archiveFilename) 
} 

答えて

43

あなたが作業にoutputs.upToDateWhen { false }を設定することによって、これを達成することができます。

この

はあなた build.gradleファイルで実行することができます。また、カスタムタスクのコンストラクタで行うことができます

handleManagementArchive.outputs.upToDateWhen { false } 

ResolveProjectArchiveDependency() { 
    outputs.upToDateWhen { false } 
} 
+1

ありがとうございました。コンストラクタのバージョンも同様に動作することを確認できます。 – Rich

関連する問題