我希望某个模块的所有子模块都依赖于另一个模块:core:log
我做了以下尝试:
第一:
plugins {
id("sage.android.library")
}
android {
namespace = "com.sage.feature.work"
}
dependencies{
subprojects{
implementation(project(":core:log"))
}
}
第二节:
subprojects{
dependencies{
implementation(project(":core:log"))
}
}
第三:
dependencies{
subprojects{
dependencies{
implementation(project(":core:log"))
}
}
}
第一个不工作,第二个和第三个直接报错。
org.gradle.API.artifacts.UnknownConfigurationException:未找到名为“implementation”的配置。
我做错了什么?
1条答案
按热度按时间tf7tbtn21#
有一个快速+肮脏的解决方案,你正在走向,我将描述无论如何,因为它是常见的,仍然提供信息,知道它是如何工作的。然后是推荐的解决方案,这是一个更复杂的。
1.快+脏
第二个示例可以正常工作(第三个示例只是有冗余的嵌套,没有帮助)。问题是,当你试图从这里将这个依赖项添加到所有子项目时,它们还没有“配置”,因为创建它的插件(java /Kotlin/...)还没有应用。所以一个快速的解决方法是首先将插件添加到子项目块中,类似这样:
这样,您就可以从这里应用该插件,它将创建配置,然后您可以向其添加依赖项。你可以在其他答案中找到类似的例子,比如this one。
这有什么问题吗紧耦合问题(有点像类继承)。Gradle文档建议不要这样做,你可以在那里找到一个解释:
查看子项目的构建脚本...更难理解某个子项目的逻辑随着越来越多的条件逻辑和更高的维护负担而变得复杂……也可以引入配置-时间耦合。这可能会阻止按需配置等优化正常工作
2.推荐方式
在同一页中还提到了他们建议的方法:会议插件。您可以在
buildSrc
中定义一个Gradle插件来应用您的约定,然后在您的模块中应用该插件。例如,你可能有一个“功能模块”插件,它应用了Kotlin插件,设置了一些编译选项,添加了一些常见的依赖项,等等。通过这种方式,您可以显式地引用要添加到子项目中的内容,而不是从外部注入它们。这样就避免了创建与根模块的紧密且不太明显的耦合。相反,您更喜欢组合方法,在这种方法中,查看子项目构建文件,您可以看到包含的所有内容,并且配置的顺序更加明显(因此您不会得到像这样奇怪的惊喜)。here还提供了更多详细信息和示例项目。