【问题标题】:Getting gradle variable from a library从库中获取 gradle 变量
【发布时间】:2018-06-29 23:36:42
【问题描述】:

有没有办法在 gradle 中导出一个变量,以便其他将该项目作为依赖项导入的项目可以访问它?

对于我的特殊情况,我有一个使用 AppCompat 的 Android 项目。我目前在gradle.properties 中有AppCompat 版本作为变量,但是AppCompat 有多个组件,我只添加我需要的那些。对于使用我的库并需要其他 AppCompat 组件的其他人,最好使用相同的版本添加它。到目前为止,他们必须自己指定版本并确保它是相同的。如果他们有办法访问我作为变量使用的版本,这样它总是同步的,那就更好了。

我希望有一个更好的解决方案,而不是说在 github 上托管一个原始 gradle 文件,它将变量添加为扩展,但到目前为止这似乎是最可行的选择。

【问题讨论】:

  • 冲突解决看起来就像现在的处理方式。如果版本不同,AppCompat 会抱怨,所以我在我的应用程序中手动更改它。我不认为所有依赖项都会发生这种情况,但如果有办法为不同版本发出错误消息,那会很有趣。 BOM 似乎也是一个可行的解决方案。我不知道,我会看看是否有任何使用它的示例项目。最后,我只是想提供一种更简单的方法来尽可能维护与我的库相同的依赖版本,其中只有我自己的库的版本代码很重要。
  • 添加了我的评论作为答案,因为这对您来说似乎已经足够了。

标签: gradle android-gradle-plugin


【解决方案1】:

我最终决定制作一个 gradle 插件是最好的解决方案。

我个人通过 jitpack 部署我的库,其中每个提交、标记或快照都可以用作一个版本。因此,重要的是我可以让用户通过更改我的库的版本号来轻松更新他们的所有依赖项,而不是必须更改每个包含的依赖项。

插件及其描述可以在here找到

本质上,它捆绑了版本代码并将它们添加为扩展。将其放在buildSrc 下可以使其自动包含在项目本身中,因此没有重复的版本代码。将它们作为变量允许它自动更新,同时让开发人员可以灵活地选择在哪里使用它,以及他们是否想要使用它。

每组版本也与库的版本相关联,因此更新和还原是无缝的

【讨论】:

    【解决方案2】:

    理论上你问的问题很困难,因为 gradle 需要先解决一个依赖项才能解决另一个依赖项,但 gradle 无法提前知道正确的顺序。您的用户可以使用自定义插件或 buildSrc 代码在主要构建过程之前获取您的 jar/pom,提取版本号。但是会很乱。

    解决根本问题的常用方法有以下三种:

    1. 如果他们的版本与您的版本不匹配,您库的用户可以使用 Gradle 解析策略 failOnversionConflict() 失败
    2. 您可以提供带有版本号的 BOM(物料清单),但这可能需要额外的 gradle 插件或最新版本的 gradle
    3. 您可以shade a library into your jar,这样您的代码始终使用该版本(不确定在您的情况下是否可行)

    (Related issue for Maven)

    【讨论】:

    • 再看一遍,BOM 似乎与我想要的不符,因为我的版本是针对与我自己的依赖项相关但在我自己的依赖项之外的依赖项。例如,如果我有一些 jackson 库,而其他人想使用其他 jackson 库,则版本应该相同,但我无法在我的 BOM 中列出所有可能的依赖项。您能详细说明将库“着色”到我的 jar 中吗?
    • 阴影本身就是一头野兽。简而言之,您从 jar 中提取类文件,更改它们在字节码上的包声明,然后将结果添加到您的 jar 中。如果只是jackson,考虑使用jackson BOM:github.com/FasterXML/jackson-bom
    • 我已经接受了你的回答,因为它让我更深入地了解了 gradle 的可能性。最后,我决定制作一个收集变量的插件是最好的方法。当 BOM 是一个基础库并且应该始终更新时,它会很好地工作。但是,由于我拥有许多其他库,我认为如果我的 BOM 包含最新更新并且用户决定恢复到旧版本,它可能会很快不同步。
    猜你喜欢
    • 2019-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多