gpt4 book ai didi

java - 为每种风格的应用程序创建多个 shadowJars

转载 作者:搜寻专家 更新时间:2023-11-01 00:54:18 25 4
gpt4 key购买 nike

我正在试验 gradle 并尝试设置一个系统来构建不同风格(品牌)的应用程序,主要因配置而异。到目前为止,我有两个版本的构建脚本 - 都不起作用。

版本 1
sourcesets中加入了第一个flavor特定的资源文件夹flavor-res,实现了覆盖部分默认资源。任务规则为每种风格定义了任务,这应该(理想情况下)触发整个 jar 的构建。

这工作正常并生成所需的 jar ,一次用于一种口味,例如

gradle clean flavorOne 

但是 shadowJar 任务只运行一次,如果我这样做的话

gradle clean flavorOne flavorTwo

精简脚本:

sourceSets {
main {
...
resources {
srcDirs = ['src/main/resources', "${project.buildDir}/flavor-res/"]
}
}
}

shadowJar { classifier = 'SNAPSHOT' }

tasks.addRule("Pattern: flavor<Name>") { String taskName ->
if (taskName.startsWith("flavor")) {

String flavorName = (taskName - "flavor")
String flavorOutDir = "${project.buildDir}/${flavorName}"

// Set output folder and jar name
task("${taskName}Configure") {
outputs.dir(flavorOutDir)

doFirst {
archivesBaseName = flavorName
project.buildDir = flavorOutDir
}
}

// Copy res to folder used in sourcesets
task("${taskName}CopyResources") {
mustRunAfter = ["${taskName}Configure"]
outputs.dir("${project.buildDir}/flavor-res")

doFirst {
copy {
from "flavors/${flavorName}/"
into "${project.buildDir}/flavor-res/"
}
}
}

shadowJar.mustRunAfter = ["${taskName}Configure", "${taskName}CopyResources"]

// Define task that depends on shadowJar
task(taskName, dependsOn: ["${taskName}Configure", "${taskName}CopyResources",
shadowJar]) {
println "Configuring ${taskName}"
}

}

感觉它可能不起作用,因为变化检测不知何故不起作用,我尝试了另一种方法。这是脚本的简化版本

版本 2

修改了规则,为每个 flavor 定义了一个 shadowJar 动态任务。

/* Removed sourceSets in this version */

shadowJar { classifier = 'SNAPSHOT' }

tasks.addRule("Pattern: flavor<Name>") { String taskName ->
if (taskName.startsWith("flavor")) {

String flavorName = (taskName - "flavor")
String flavorOutDir = "${project.buildDir}/${flavorName}"

// Set resources for main sourceset
task("${taskName}Configure") {
outputs.dir(flavorOutDir)

doFirst {
archivesBaseName = flavorName
sourceSets.main.resources.srcDirs = ['src/main/resources', "${flavorOutDir}/flavor-res"]
project.buildDir = flavorOutDir
}
}

task("${taskName}CopyResources") {
outputs.dir("${flavorOutDir}/flavor-res")
dependsOn "${taskName}Configure"

doFirst {
copy {
from "flavors/${flavorName}/"
into "${project.buildDir}/flavor-res/"
}
}
}

// This should shadowJar for each flavor - but generate jars dont have the required artifacts.
task ("${taskName}Build", type: ShadowJar) {

from sourceSets.main.output
configurations = [ configurations.runtime ]
classifier = 'SNAPSHOT'

dependsOn "${taskName}CopyResources"
}

task(taskName, dependsOn: ["${taskName}Build"]) {
}
}
}

但是,现在生成的 jar 格式不正确。第一种口味只获得主要的工件,但没有显示 jar 。第二个 jar 只有 list ,没有其他东西。

实现该目标的正确方法是什么。

PS:不,它不是安卓应用(味道只是品牌的代名词)。

最佳答案

我决定重新创建一个 flavor 构建脚本,因为它可以简化为您现在拥有的。 ShadowJar 任务可以自行处理所有类和资源的复制,无需定义单独的类和资源。我还采用了一些本应应用于 shadowJar 任务的默认配置,并将其应用于自定义 ShadowJar 任务以获得相同的行为。

我首先构建一个快速测试项目结构,可以在这里找到: Test Structure

然后我想出了以下脚本:


import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar

plugins {
id 'java'
id "com.github.johnrengelman.shadow" version "2.0.4"
}

group 'your-group'
version 'dev-SNAPSHOT'

sourceCompatibility = 1.8

repositories {
mavenCentral()
}

dependencies {
// Example dependency
compile group: 'com.google.guava', name: 'guava', version: '19.0'
}

tasks.addRule("Pattern: flavor<Name>") { def taskName ->
if (!taskName.startsWith("flavor")) {
return
}

def flavorName = taskName - "flavor"
// Define the shadow task
def shadowTask = task ("${flavorName}ShadowJar", type: ShadowJar) {
classifier = flavorName
// Add our flavor resources, first to prioritize these resources
from file("src/main/flavors/${flavorName}")
// Include our project classes
from project.sourceSets.main.output
// Don't include duplicate resources, only the first ones added, in
// this case the flavored resources will override the default ones
duplicatesStrategy = DuplicatesStrategy.EXCLUDE
// Some defaults taken from the default shadowJar task
// https://github.com/johnrengelman/shadow/blob/master/src/main/groovy/com/github/jengelman/gradle/plugins/shadow/ShadowJavaPlugin.groovy#L48
configurations = [ project.configurations.runtime ]
manifest.inheritFrom project.tasks.jar.manifest
exclude('META-INF/INDEX.LIST', 'META-INF/*.SF', 'META-INF/*.DSA', 'META-INF/*.RSA')
}

// Define the flavor task
task ("${taskName}", dependsOn: shadowTask) {}
}

关于java - 为每种风格的应用程序创建多个 shadowJars,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50994203/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com