gpt4 book ai didi

java - Gradle Android 依赖产品风格

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:20:07 25 4
gpt4 key购买 nike

我想知道根项目是否有办法在其依赖项中定义/注入(inject)一些属性。更具体地说,我遇到的问题是,在运行汇编/编译任务之前,库项目必须知道是使用“免费”还是“专业”Java 源代码和其他资源。有点像为库项目(从它的父项目继承)指定产品风格,但这不受 Gradle 的 Android 插件支持。更改库项目结构,即创建“免费”和“专业”库不是一种选择。

编辑:到目前为止,我取得的最好成绩是这样的:

root: build.gradle

android {
...

productFlavors {
free, pro
}

sourceSets {
free {
project(':..:lib') {
groupFreePro = 'free'
// java.srcDirs = ['src', 'free/src']
}
}

pro {
project(':..:lib') {
groupFreePro = 'pro'
// java.srcDirs = ['src', 'pro/src']
}
}
...
}
}

库: gradle.build

android {
...
sourceSets {
main {
java.srcDirs = [groupFreePro + '/src']
res.srcDirs = [groupFreePro + '/res']
}
}
...
}
}

这样我就可以将 groupFreePro 变量注入(inject)到 lib 项目中。但是这种方法有一个问题:

此时,当 lib 项目到达它的 android -> sourceSets 任务时,groupFreePro 始终设置为“pro”。我认为这是因为根项目中的所有 sourceSets 都被读取了(而不仅仅是我想要构建的一个变体;例如“免费”),因此最后一个集/任务总是覆盖任何先前设置的 groupFreePro 值。

如果我尝试以任何其他方式设置 groupFreePro 的值,它要么被覆盖(如上述情况),要么我不知道我应该调用此变量注入(inject)东西来设置的适当任务/时间/地点变量到所需的值。取消注释根项目中的 java.srcDirs 也无济于事。

我尝试自己解决这些问题,但我对 Gradle 真的很陌生,而且缺乏适当的文档(至少对于 Android 部分)让我在大部分时间都在猜测该怎么做,所以我做了很多反复试验(但现在我有点卡住了)。

最佳答案

这就是我目前解决问题的方法。这不是一个完美的解决方案,但现在已经足够好了。

更新!

我更新了答案以包含最新的 0.9.2 Gradle 插件及其新的(最)功能(主要是更新了库构建脚本)。

root: gradle.build

// global variables
ext {
// can be set to default values or blank
groupFreePro = "free"
}

// start parameters
println "Start parametes: tasks = " + gradle.startParameter.getTaskNames()

gradle.startParameter.getTaskNames().each { task ->
if (task.contains("Free") || task.contains("F")) {
groupFreePro = "free"
} else if (task.contains("Pro") || task.contains("P")) {
groupFreePro = "pro"
}
println "groupFreePro = " + groupFreePro
}

android {
...
}

task.contains("F") 用于处理缩写版本或运行任务(如果我们想将脚本作为 gradle aFD 运行)。

ext 下的全局变量可以设置为默认值。在这种情况下,即使您运行任务名称中没有“Free/Pro”的脚本,它也应该可以正常工作。默认值的缺点是,如果设置不当,构建可能不会崩溃(如果您希望构建仅在任务名称中指定“Free/Pro”时才工作)。

库: gradle.build

android {
...
defaultPublishConfig groupFreePro + groupDebugRelease.capitalize()

productFlavors {
free
pro
}

...
sourceSets {
main {
java.srcDirs = ['/src']
res.srcDirs = ['/res']
}

free {
java.srcDirs = ["free/src"]
res.srcDirs = ["free/res"]
}

pro {
java.srcDirs = ["pro/src"]
res.srcDirs = ["pro/res"]
}
}
...
}

dependencies {
freeCompile fileTree(dir: 'free/lib', include: '*.jar')
}

更新:

库现在包含 defaultPublishConfig,因此我不需要指定

        java.srcDirs = ["src", groupFreePro + "/src"]
res.srcDirs = [groupFreePro + "/res"]

任何更多,以及现在使用的自定义 flavor 编译,即 flavor1Compile(在 dependencies block 中)。

dependencies block 中编写 compile project(path: ':project', configuration: 'flavor1Debug') 的选项对我们来说并不适用,因为你必须通过依赖项传递这些选项,如果您有多个 flavor 组/维度,这意味着或多或少所有 flavor 组合都必须在“非最后”依赖项中处理(即具有其他依赖项的依赖项(具有多种 flavor )) 也是如此。



println 行只是为了查看并确保传递了正确的参数。

此解决方案的优点(与 Varun 的方案相比)是您只需运行一个(原始)任务。这也意味着它可以(或至少应该)与 Android Studio 一起工作而没有任何问题。

此解决方案的缺点是,如果您想使用缺少 释放部分任务。我想这也可以处理,但我没有这样做,因为目前的解决方案对我来说已经足够好了(尽管如果我改进当前的解决方案,我可能也会更新这个答案)。

使用 gradle.taskGraph.whenReady 还有其他可能的解决方案,但我不知道如何正确设置 srcDirs(尤其是依赖项)。欢迎提出建议。

关于java - Gradle Android 依赖产品风格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19013821/

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