gradle - 如何将ResolutionStrategies与Gradle混合使用

标签 gradle dependency-management transitive-dependency

假设我在gradle构建脚本中具有以下内容:

configurations.all {
  resolutionStrategy {

    failOnVersionConflict()

    force 'com.google.guava:guava:18.0'
    }
}

如果找到了多个版本的jar,则此操作将失败,但 Guava 会强制使用18.0版。

现在,让我们想象一下,我想为所有外部 jar 使用failOnVersionConflict(),并被迫使用force子句(这样我就知道我在做什么),但是我想为某些特定组使用默认的resolutionStrategy(最新版本),像com.mycompany一样。

这样的事情可能吗?

我正在查看此文档页面:

https://gradle.org/docs/current/dsl/org.gradle.api.artifacts.ResolutionStrategy.html

最佳答案

我找到了自己的答案...但这涉及到一些“黑客攻击” ...但是,毕竟,这正是gradle所提供的...

def dependencyErrors = 0

configurations.all {
  resolutionStrategy {

    def thirdPartyPackages = [:]
    def forced = [ 
        'com.google.guava:guava' : '18.0'
        //Here all forced dependencies...
    ]


     eachDependency { DependencyResolveDetails details ->


          if (!details.requested.group.startsWith('com.mycompany')) {

                def key = details.requested.group + ":" + details.requested.name
                if(!thirdPartyPackages.containsKey(key)) {
                    if(forced.containsKey(key)) {
                        details.useVersion forced.get(key)
                    }                   
                    else {
                        thirdPartyPackages.put(key, details.requested.version);
                    }
                }
                else {
                    def existing =  thirdPartyPackages.get(key);
                    if(existing != details.requested.version) {
                        logger.error "Conflicting versions for [$key]"
                        logger.error "    [$existing]"
                        logger.error "    [$details.requested.version]"
                        dependencyErrors++
                    }
                }
          }
      }

  }
}

myTask.doFirst {
  //here it might also be doLast, or whatever you need. I just put it before a war task, but it might depend on each need. 
  if(dependencyErrors > 0) {
    ant.fail 'There are ' + dependencyErrors + ' conflicting jar versions in the build.'
  }
}

关于gradle - 如何将ResolutionStrategies与Gradle混合使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29010454/

相关文章:

jquery - 如何使用 Require.js 配置库插件?

asp.net - 不引用 MVC 的 AllowHtml 属性

maven - 从 Maven pom 中排除传递依赖

c# - .Net Core 1.1 中的传递引用

go - 如何为 go get 指定安装依赖项

java - Maven - 对于部署在 Artifactory 上的 Artifact ,传递依赖性没有得到解决

java - Gradle中的String.ReplaceAlli缺少要转义的字符

less - 不用安装插件,用Gradle将LESS编译成CSS

android - AndroidError:程序类型已存在:当我尝试从Android Studio生成Signed APK时,android_serialport_api.SerialPort

gradle - 如何使用 JAVA_OPTS 在 gitlab-ci.yaml 中设置 Gradle 代理变量