我正在研究多种风格的app
。 (下面的gradle文件)
它使用名为tracker
的库,它遵循相同的风格internal
和external
现在对于棘手的部分,来一个名为feature
的新模块,这个模块没有味道,但它需要tracker
作为依赖
app.gradle:
android {
buildTypes {
debug {
}
release {
}
}
flavorDimensions "target"
productFlavors {
internal {
dimension "target"
}
external {
dimension "target"
}
}
}
tracker.gradle:
android {
publishNonDefault true
buildTypes {
release {
}
debug {
}
}
flavorDimensions 'target'
productFlavors {
internal {
dimension "target"
}
external {
dimension "target"
}
}
}
feature.gradle:
android {
compileSdkVersion rootProject.ext.compileSdkVersion
defaultConfig {
compileSdkVersion rootProject.ext.compileSdkVersion
buildToolsVersion rootProject.ext.buildToolsVersion
defaultConfig {
minSdkVersion rootProject.ext.minSdkVersion
targetSdkVersion rootProject.ext.targetSdkVersion
versionCode 1
versionName "1.0"
javaCompileOptions {
annotationProcessorOptions {
includeCompileClasspath false
}
}
}
}
}
dependencies {
implementation(
[...]
project(':tracker')
)
}
当我尝试 gradle sync 时,以下是errors
:
Unable to resolve dependency for ':feature@debug/compileClasspath': Could not resolve project :tracker.
Could not resolve project :tracker.
Required by:
project :feature
> Project :feature declares a dependency from configuration 'implementation' to configuration 'externalRelease' which is not declared in the descriptor for project :tracker.
Unable to resolve dependency for ':feature@debugAndroidTest/compileClasspath': Could not resolve project :tracker.
Could not resolve project :tracker.
[...]
答案 0 :(得分:3)
我的gradle版本是4.4。
在文档中, Android developer和Android Plugin DSL Reference 表明,应添加以下代码。
missingDimensionStrategy 'external'
missingDimensionStrategy 'target'
Android Plugin DSL Reference image
但这对我不起作用。最后,我在feature.gradle中添加了以下代码。
flavorDimensions 'target'
productFlavors {
internal {
dimension "target"
}
}
答案 1 :(得分:2)
从您的问题来看,我得到的是您尝试将库tracker
作为依赖项添加到feature
模块中。在feature.gradle
中尝试以下操作:
dependencies {
implementation project(':tracker')
}
使用Gradle 3.0,有两个新关键字implementation
和api
。不推荐使用compile
关键字。您可以使用implementation
作为默认值。使用api
尤其是当你的项目中有传递依赖项时(Module - > Lib1 - > Lib2),你需要告诉Gradle该模块想要将该依赖项传递给其他模块,这样就可以了在运行时和编译时都可以使用它们。
好的图片解释:
以下是一篇很好的文章,介绍了implementation
和api
关键字之间的区别:Implementation Vs Api in Android Gradle plugin 3.0
官方文件说明:
以下是官方文档Use the new dependency configurations的简要说明:
<强> 实现: 强>
当您的模块配置实现依赖项时,它让Gradle知道模块不希望在编译时将依赖项泄漏给其他模块。也就是说,依赖性仅在运行时可用于其他模块。使用此依赖项配置而不是api或compile可以显着缩短构建时间,因为它减少了构建系统需要重新编译的项目数量。例如,如果实现依赖项更改其API,则Gradle仅重新编译该依赖项以及直接依赖于它的模块。大多数应用和测试模块都应该使用此配置。
<强> API: 强>
当模块包含api依赖项时,它让Gradle知道模块想要将该依赖项传递到其他模块,以便在运行时和编译时都可以使用它。此配置的行为与compile(现在已弃用)类似,您通常只应在库模块中使用它。这是因为,如果api依赖项更改其外部API,Gradle将重新编译在编译时有权访问该依赖项的所有模块。因此,拥有大量的api依赖项可以显着增加构建时间。除非您希望将依赖项的API公开给单独的测试模块,否则应用程序模块应该使用实现依赖项。
希望这有帮助。
<强>更新强>
为了完整起见,gradle 4.1似乎存在已知问题。使用4.3版有帮助。感谢Damien。
答案 2 :(得分:0)
好的,谢谢@ ramin-eftekhari我设法让它发挥作用
答案 3 :(得分:0)
尝试在应用build.gradle
defaultConfig
块中添加此内容:
missingDimensionStrategy "internal"