私は1つのアプリケーションを構築するためにモノリシックbuild.gradle
を持っていました。それは私のプラグインをbuildsrcで数回呼び出す/
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
}
}
}
}
}
おかげランス私にオンラインで見つけることは不可能簡潔な答えを与えます。だから、私は何とかループでサブプロジェクトを構築するために私のプラグインを再加工しなければならないということですか?または、私は別のモジュールsubdirsで別のbuild.gradlesを行う必要がありますか? – rupps
あなたのことを正確に知るのは難しいです。おそらく、単に[タスク](https://docs.gradle.org/current/dsl/org.gradle.api.Task.html)を実装したいだけです。これは 'build.gradle'で何度も追加することができます。そうであれば、プラグインは必要ありません。詳細情報なしで知ることは難しい –
タスクの外では決して「仕事」をしないでください。最終的に、あなたのプラグインはプロジェクトにタスクを追加し、タスクをGradleの[DAG](https://en.wikipedia)に「配線」します。org/wiki/Directed_cyclic_graph)。 (Plugin.apply(Project)の中で "仕事"をしないなど)設定フェーズでは、決して "仕事"を行うべきではありません。 –