2017-11-28 11 views
0

私は1つのアプリケーションを構築するためにモノリシックbuild.gradleを持っていました。それは私のプラグインをbuildsrcで数回呼び出す/

は私がGreetingPluginの公式のGradleチュートリアル以下、 buildsrc/でカスタムプラグインに build.gradleですべてを動かすことに成功し

(などなど縮小化、ファイルを結合し、GZIP、CDNにアップロード、外部スクリプトを呼び出して、)複数のタスクから構成されますdocs。いくつかの努力の後、私は正常にbuild.gradleから今それを呼び出すことができAMD期待どおりに動作します:

group 'CDN' 
version '1.0-SNAPSHOT' 

buildscript { 
    . 
    . 
} 

println "building user app" 
apply plugin: BuildAppModule 
appmodulebuilder.modulename = 'user' 

これまでのところは良いです。しかし、buildsrc /のプラグインにすべてを移動するという私の目的は、このプラグインを何度か呼び出して別のモジュールをビルドすることでした。

. 
. 
println "building user app" 
apply plugin: BuildAppModule 
appmodulebuilder.modulename = 'user' 

println "building admin app" 
apply plugin: BuildAppModule 
appmodulebuilder.modulename = 'admin' 

この

task buildUser { 
    println "building user app" 
    apply plugin: BuildAppModule 
    appmodulebuilder.modulename = 'user' 
} 
task buildAdmin { 
    println "building admin app" 
    apply plugin: BuildAppModule 
    appmodulebuilder.modulename = 'admin' 
} 

この

task buildUser { 
    doLast { 
     println "building user app" 
     apply plugin: BuildAppModule 
     appmodulebuilder.modulename = 'user' 
    } 
} 
task buildAdmin { 
    doLast { 
     println "building admin app" 
     apply plugin: BuildAppModule 
     appmodulebuilder.modulename = 'admin' 
    } 
} 

この

apply plugin: BuildAppModule 
    task buildUser (Type: BuildAppModule) { 
     doLast { 
      println "building user app" 
      appmodulebuilder.modulename = 'user' 
     } 
    } 
    task buildAdmin (Type: BuildAppModule) { 
     doLast { 
      println "building admin app" 
      appmodulebuilder.modulename = 'admin' 
     } 
    } 

単純には、私はこれを試してみました

しかし、プラグインは決して2回実行されません。一番近いところでは、プラグインは最後に提供された値で1回実行されます。

誰でも "gradle documentationのプラグインのセクションを読んでください"と答えてもらえますか?答えの種類は? (私は持っていますが、Gradleの新規参入者のために、それは非常に近寄りがたい見つけたこと!)


EDIT:全体のプラグインは、私のニーズには、一連のディレクトリ上でこれ​​を実行することです。

メインBUILDSRC//グルーヴィー/ BuildAppModule.groovy

import org.gradle.api.Plugin; 
import org.gradle.api.Project; 
import org.gradle.api.artifacts.Configuration; 
import org.gradle.api.artifacts.ProjectDependency; 
import org.gradle.api.tasks.Exec; 

class BuildAppModuleExtension { 
    String modulename 
} 

class BuildAppModule implements Plugin<Project> { 


    void apply(Project project) { 

     def extension = project.extensions.create('appmodulebuilder', BuildAppModuleExtension) 

     project.afterEvaluate { 
      println "-----------------------------" 
      println extension.modulename 
      println "-----------------------------" 
     } 

     def APP = extension.modulename 
     def buildDir = project.getBuildDir() 

     project.configure(project) { 

      apply plugin: 'js' 
      javascript.source { 
       /** common libraries */ 
       lib { 
        js { 
         srcDir 'src/lib' 
         include "*.js" 
        } 
       } 

       /** specific app files */ 
       appfiles { 
        js { 
         srcDir "src/app/${APP}" 
         include "*.js" 
        } 
       } 

       closurein { 
        js { 
         srcDir 'src/lib/closure' 
         include "in.jst" 
        } 
       } 
       closureout { 
        js { 
         srcDir 'src/lib/closure' 
         include "out.jst" 
        } 
       } 
      } 

      // Configure the built-in task 
      combineJs { 
       source = [ javascript.source.closurein.js.files, javascript.source.lib.js.files, javascript.source.appfiles.js.files, javascript.source.closureout.js.files ] 
       dest = file("${buildDir}/${APP}/js/code.debug.js") 
      } 


      minifyJs { 
       source = combineJs 
       dest = file("${buildDir}/${APP}/js/code.min.js") 
       sourceMap = file("${buildDir}/${APP}/js/code.sourcemap.json") 
       closure { 
        warningLevel = 'QUIET' 
       } 
       dependsOn 'undebug' 
      } 

      gzipJs { 
       source=file("${buildDir}/${APP}/js/code.min.js") 
       dest = file("${buildDir}/out/app/lib-${APP}/code.js") 
      } 

      apply plugin: 'css' 
      css.source { 
       lib { 
        css { 
         srcDir 'src/res' 
         include "*.css" 
        } 
       } 
       appfiles { 
        css { 
         srcDir "src/app/${APP}/res" 
         include "*.css" 
        } 
       } 
      } 

      // Specify a collection of files to be combined, then minified and finally GZip compressed. 

      combineCss { 
       source = [css.source.lib.css.files, css.source.appfiles.css.files] 
       dest = "${buildDir}/${APP}/res/style.all.css" 
      } 

      minifyCss { 
       source = combineCss 
       dest = "${buildDir}/${APP}/res/style.min.css" 
       yuicompressor { // Optional 
        lineBreakPos = -1 
       } 
      } 

      gzipCss { 
       dependsOn 'minifyCss' 
       source = minifyCss 
       dest = "${buildDir}/out/app/lib-${APP}/style.css" 
      } 

     } 
     project.task('gzipHtml') { 

      doLast { 

       def uploadOut = new ByteArrayOutputStream() 

       getProject().exec { 

        println "$buildDir" 
        commandLine "scripts/dohtml.sh","src/app","$buildDir/out/app", "$APP" 
        standardOutput = uploadOut 

       } 

       println uploadOut 
      } 
     } 

     /** upload module to the CDN, the final step */ 
     project.task('upload') { 


      dependsOn 'gzipJs' 
      dependsOn 'gzipHtml' 

      doLast { 

       println "UPLOAD $APP" 
       def uploadOut = new ByteArrayOutputStream() 

       getProject().exec { 

        println "$buildDir" 
        commandLine "scripts/upload.sh","$buildDir/out/app/","s3://xxxxxxx/public/app/" 
        standardOutput = uploadOut 

       } 

       println uploadOut 

      } 

      /** remove window.console.log from the combined JS file */ 
      project.task('undebug') { 

       dependsOn 'combineJs' 

       doLast { 

        def uploadOut = new ByteArrayOutputStream() 

        getProject().exec { 

         println "UNDEBUG $APP" 
         commandLine "scripts/undebug.sh","${buildDir}/${APP}/js/code.debug.js" 
         standardOutput = uploadOut 

        } 

        println uploadOut 
       } 
      } 
     } 
    } 
} 

答えて

1

プラグインはプロジェクトだけに一度に適用することができます。同じプラグインを2回目以降に適用しようとしても効果はありません。

プラグインの適用後に設定できるextension objectを追加する必要があります。

例:

apply plugin: BuildAppModule 
appModuleBuilder { 
    moduleNames = ['user', 'admin']   
} 

それとも

apply plugin: BuildAppModule 
appModuleBuilder { 
    module { 
     name = 'user' 
     type = 'xxx' 
    } 
    module { 
     name = 'admin' 
     type = 'yyy' 
    } 
} 
+0

おかげランス私にオンラインで見つけることは不可能簡潔な答えを与えます。だから、私は何とかループでサブプロジェクトを構築するために私のプラグインを再加工しなければならないということですか?または、私は別のモジュールsubdirsで別のbuild.gradlesを行う必要がありますか? – rupps

+0

あなたのことを正確に知るのは難しいです。おそらく、単に[タスク](https://docs.gradle.org/current/dsl/org.gradle.api.Task.html)を実装したいだけです。これは 'build.gradle'で何度も追加することができます。そうであれば、プラグインは必要ありません。詳細情報なしで知ることは難しい –

+1

タスクの外では決して「仕事」をしないでください。最終的に、あなたのプラグインはプロジェクトにタスクを追加し、タスクをGradleの[DAG](https://en.wikipedia)に「配線」します。org/wiki/Directed_cyclic_graph)。 (Plugin.apply(Project)の中で "仕事"をしないなど)設定フェーズでは、決して "仕事"を行うべきではありません。 –

関連する問題