【问题标题】:Gradle. Resolved versions for compilation (x.x.x) and packaging (y.y.y) differ摇篮。编译 (x.x.x) 和打包 (y.y.y) 的已解决版本不同
【发布时间】:2017-03-02 14:02:06
【问题描述】:

cordova中有很多插件,其中很多使用google play服务。并且每个插件都想使用一些特殊版本的播放服务。真的很烦。

为了解决这个问题,我尝试在 graddle 中创建简单的依赖版本解析器。它应该从某些插件依赖项(我的意思是播放服务版本)中获取所需的版本,并为其他插件依赖项设置相同的版本。

这是我的脚本:

def right_version = "9+";
configurations.all{
    resolutionStrategy{
        eachDependency { DependencyResolveDetails details ->
            if (details.requested.name.contains('play-services') && details.requested.version != '9+') {
                right_version = details.requested.version
            }
        }
        eachDependency { DependencyResolveDetails details ->
            if ( details.requested.name.contains('play-services') ){
                details.useVersion right_version
            }
        }
    }
}

它工作正常,但有一个小问题。我收到如下错误:

Conflict with dependency 'com.google.android.gms:play-services-ads'. Resolved versions for compilation (10.2.0) and packaging (9.8.0) differ. This can generate runtime errors due to mismatched resources.

是什么原因?或者您知道解决依赖冲突的更好方法?

【问题讨论】:

    标签: android cordova gradle dependency-management


    【解决方案1】:

    如果您使用此 ide 进行开发,请确保您没有在 Android Studio 中脱机。您可以检查为 File>Settings>Build,Execution,Deployment>Gradle。 其次,如果您使用的是命令行工具或 Android Studio,您必须在 application 或 appbuild.gradle 中将 google play 服务更新为最新版本,例如 将 'com.google.android.gms:play-services-location:9.2.0' 编译为最新版本 编译 'com.google.android.gms:play-services-location:10.2.0'。 您可以从此处的列表中选择特定版本的 play services api 而不是完整的 google play services 包 [https://developers.google.com/android/guides/setup][1]

    【讨论】:

    • 关键是有些人可以将我的cordova插件(使用google play服务)与其他一些cordova插件(不是最新版本的play服务)一起使用。所以,我无法通过更新所有插件中的播放服务版本来解决这个问题。而且我不为这个脚本使用 android studio。我通过 cordova CLI 运行构建过程。
    • Gradle IntelliJ 用作包装器,允许在cordova 的任何插件中使用的模块/库中订购谷歌服务版本。强烈建议任何android/ 的应用程序模块科尔多瓦应用程序应该更新到最新版本的播放服务库。因此,任何应用程序的库/模块中的旧版本支持和应用程序模块中的新版本支持都由 Gradle 本身自动管理。
    • 我不确定使用最新版本是否是最佳解决方案。 API 中的一些更改可能会杀死您的插件,因此我更喜欢使用经过测试的主要版本的库。无论如何,即使这是一个好主意,它在现实世界中也行不通。我知道带有旧播放服务的插件(实际上我的用户写给我关于不同版本的问题)。
    【解决方案2】:

    最后,我找到了问题的根源。使用 eachDependency 两次并在第二次使用时更改版本是一个坏主意。看起来,依赖在第一个 eachDependency 之后被批准(或类似的东西)。因此,使用以下代码一切正常:

    def right_version = "9+";
    configurations.all{
        dependencies.all{ Dependency d ->
            def right_version_copy = right_version
            if(d.getName().contains("play-services") && d.getVersion() != right_version_copy){
                right_version = d.getVersion()
            }
        }
        resolutionStrategy{
            eachDependency { DependencyResolveDetails details ->
                if ( details.requested.name.contains('play-services') ){
                    details.useVersion right_version
                }
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-26
      • 2020-11-13
      • 1970-01-01
      • 2015-01-16
      • 1970-01-01
      • 2021-03-01
      相关资源
      最近更新 更多