Gradle - 带有库的Android App的DependencySubstitution

akd*_*005 5 android dependency-management gradle android-gradle-plugin

我有一个Android应用程序项目,里面有单独的android库模块,它作为二进制文件发布.我想添加一个能够在从源构建库或使用已发布的工件之间切换gradle的能力.Android应用默认依赖于二进制工件:

compile "com.example.konstantin.mylibrary:mylibrary:${mylibraryVersion}"

现在我希望我的二进制工件被源代码替换,所以我在root build.gradle文件中添加以下代码:

configurations.all {
resolutionStrategy {
    dependencySubstitution {
        substitute module("com.example.konstantin.mylibrary:mylibrary:${mylibraryVersion}") with project(':mylibrary')
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,当我正在尝试构建gradle仍然采用二进制工件.这有什么不对?

这是完整的源代码

同样有趣的是,如果我将依赖项替换代码移动到allprojects部分或应用程序模块build.gradle文件,则gradle无法使用以下消息构建:

Error:Module version MyApplication:app:unspecified, configuration '_debugCompile' declares a dependency on configuration 'default' which is not declared in the module descriptor for MyApplication:mylibrary:unspecified
Run Code Online (Sandbox Code Playgroud)

akd*_*005 4

最后我找到了一个可行的解决方案。如果我反过来做的话,不知怎的,这会起作用。而不是用项目模块替换二进制文件

substitute module("com.example.konstantin.mylibrary:mylibrary:${mylibraryVersion}") with project(':mylibrary')
Run Code Online (Sandbox Code Playgroud)

我可以用二进制替换项目模块:

substitute project(':mylibrary') with module("com.example.konstantin.mylibrary:mylibrary:${mylibraryVersion}")
Run Code Online (Sandbox Code Playgroud)

比魔法更有效。完整的工作代码可在示例存储库的单独分支上找到

然而,这不是一个理想的解决方案,因为我必须始终在 settings.gradle 中链接项目模块,并且如果不检查它就无法构建。