【问题标题】:Is it possible to enforce usage of specific library version through the whole project?是否可以在整个项目中强制使用特定的库版本?
【发布时间】:2022-01-06 00:45:50
【问题描述】:

我正在尝试修复 Snyk 工具在我的程序中发现的一些漏洞,但其中一些漏洞来自我正在使用的库(如 Apache 的 Pulsar)。 例如,Pulsar 正在使用 2.8.6 版本的 gson,根据 Snyk 的说法,它是易受攻击的,下一个安全版本是 2.8.9。 是否可以强制我使用的所有库使用 gson 2.8.9 版(通过 gradle)?或者更确切地说不是因为这是一个非常愚蠢的想法,容易出现意外行为?

谢谢

【问题讨论】:

    标签: gradle dependencies snyk


    【解决方案1】:

    这是一件合情合理的事情。官方支持升级库的新版本 pulsar 会更好,但您通常可以安全地升级传递依赖项。特别是,如果库作者遵循语义版本控制,单点版本(即 2.8.6 -> 2.8.9)可能是安全的。

    Gradle 提供了几种方法来做到这一点,现在(从 gradle 7.3 开始)似乎最典型的方法是使用约束。

    例如,如果您的依赖项如下所示:

    dependencies {
      implementation 'org.apache.pulsar:pulsar-client-all:2.9.1'
    }
    

    运行依赖洞察将显示我们正在解析 gson 2.8.6

    `./gradlew dependencyInsight --dependency gson`
    
    
    ...
    
    com.google.code.gson:gson:2.8.6
    \--- org.apache.pulsar:pulsar-package-core:2.9.1
         \--- org.apache.pulsar:pulsar-client-all:2.9.1
              \--- compileClasspath
    

    我们可以添加一个约束,强制它使用这样的新版本。

    dependencies {
      implementation 'org.apache.pulsar:pulsar-client-all:2.9.1'
      constraints {
            implementation('com.google.code.gson:gson:2.8.9') {
                because 'previous versions have a security vulnerability'
            }
      }
    }
    

    现在我们得到以下结果

    com.google.code.gson:gson:2.8.9
    ...
       Selection reasons:
          - By constraint : previous versions have a security vulnerability
          - By conflict resolution : between versions 2.8.9 and 2.8.6
    
    com.google.code.gson:gson:2.8.9
    \--- compileClasspath
    
    com.google.code.gson:gson:2.8.6 -> 2.8.9
    \--- org.apache.pulsar:pulsar-package-core:2.9.1
         \--- org.apache.pulsar:pulsar-client-all:2.9.1
              \--- compileClasspath
    

    现在可以按照您的意愿解析 2.8.9。

    Gradle 有相当广泛的 documentation 关于依赖管理,这是查找有关此类内容的更多信息的好方法。

    【讨论】:

    • 很高兴听到这个消息。我设法到达了我所有项目的 gson 版本都是 2.8.x -> 2.8.9 的部分,但是当我在新项目上运行 Snyk 时,它仍然未能声称它仍然找到旧版本。您确定 -> 表示它将使用新提供的版本吗?并且它可能只看到项目中的旧版本文件?谢谢
    • 我不知道 Snyk 究竟是如何工作的。它看什么?如果它只是直接查看您的所有依赖项,它可能会看到一个包含 2.8.6 并且不知道您已覆盖它?另外,你是如何打包你的库的?您应该能够查看您的 POM 并查看它指定了哪些依赖项。
    【解决方案2】:

    我不确定这是一个好主意,我认为更新依赖于稳定版 gson 的 Apache 的 Pulsar 版本是一个更好的主意。

    但仍不是 100% 确定,请等待其他澄清。

    你想要的仍然可以像下面这样完成

    configurations.all {
        exclude group: 'com.google.code.gson:gson:2.8.6'
    }
    

    这将排除项目中所有版本为 2.8.6 的 gson。

    那么你可以根据需要添加以下版本

    implementation 'com.google.code.gson:gson:2.8.9'
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-08-16
      • 1970-01-01
      • 1970-01-01
      • 2013-01-29
      • 1970-01-01
      • 2011-05-07
      • 1970-01-01
      相关资源
      最近更新 更多