scala - 正确替换编译依赖
问题描述
这是我关于 gradle 驱动的纯 scala 项目的小问题系列之一。未来几天还会有更多。编辑:鉴于对这个问题的不好接受,我至少必须在发布它们之前对其进行返工。
几周前,我开始了一个新的私有 scala 项目,我想用 gradle 构建它。如果我只想做一些小的编辑,IDE 往往会在我的系统上启动时间很长,并且无法扩展。所以我选择了 gradle,因为我已经知道了(我也可以选择 sbt)。这也让我可以使用 IDE,以防我真的需要一组更大的工具,但大多数时候我只需要一个命令行。
我安装的最新版本是某个版本 2.x(在一段时间内仍然运行良好),然后我迅速升级到更新的 5.x 并且 - 部分测试新的插件语法 - 最后几天我还看了6.0。由于我的构建脚本中存在编译依赖项,这个最新版本给了我弃用警告。使用 6.0 版或多或少地使我的构建时间翻了一番,所以除非我真的需要一些新功能,否则我不会使用它,但是在使用 gradle 5.x 时,弃用警告仍然适用(如果不是更多的话)。
没问题,我想,因为 gradle-runtime 已经建议了如何修复它们。但是这种简单的用实现替换编译是行不通的,因为我(ab-)在我的代码中使用了编译依赖项的传递性。然后我希望其他人也有同样的问题。他们中有很多人提供了大量的指南来解决这个问题。不幸的是,没有一个适用于纯 scala 项目。对于 android 似乎是一个明显的 api 依赖解决方案。Java 项目可以使用带有 api 依赖关系的 java-library 插件(这可能也是上述 android 项目解决方案的基础)。但是对于 scala 没有这样的方法,或者至少我还没有找到它。
所以,要明确一点:我在这里有一个多项目设置,我只为与其他子项目的依赖关系而苦苦挣扎。不依赖于外部资源。并且替换运行时(用于外部库)和 testCompile 依赖项完全没有问题。
所以,这是我的问题:是否有适当/规范的方法来替换纯 scala 项目中的编译依赖项?(虽然我对在几个小时前自己的评论中使用“官方”并不特别满意,但这种观点呢:不管最初是谁创建了 scala 插件(scala-team、scala-community、gradle-team、或 gradle-community),当时 gradle-team 决定将其包含在他们的发行版中,现在 gradle-team 决定将编译依赖项标记为已弃用。那么 gradle-team 不应该对如何继续维护也有官方意见scala-projects?)或者没有共同的建议,我只能在这些选项之间进行选择,无论出于何种原因,这些选项都不是最佳的:
- 坚持编译依赖。从长远来看,绝对不是面向未来的。
- 展开所有传递依赖并添加新的(技术上不必要的)依赖。如果 A 依赖于 B 并且 B 依赖于 C(并且 A 实际上使用来自 C 的定义),那么也添加从 A 到 C 的依赖关系。膨胀依赖图和构建脚本。
- 尽管我管理 scala 项目只是为了有一个 api 依赖项,但应用 java-library(到非应用程序项目)。java-library 和 scala 都扩展了 java 插件,所以我希望这里没有真正的伤害。可能是最好的解决方案,尽管我不确定为单一依赖类型添加一个全新的插件是否是正确的选择。并且将任何 'java'-thing 添加到 'scala'-projects 似乎很奇怪。
- 以某种方式重新发明轮子,并定义我自己的 api 依赖项。这似乎是最丑陋的方式,因为我必须将一些代码从 gradle-repository 复制到我自己的项目中。这就是插件的用途,不是吗。
提前致谢。
解决方案
只需应用java-library
插件并使用api
. 将插件视为 Java平台库插件,而不是 Java语言库插件。
请注意,要完全正常运行,您至少需要 Gradle 5.6,否则某些接线不完整。
推荐阅读
- r - 在 R 中将值转换为日期
- reactjs - React-Table:行选择 - 无法选择多行
- sql - Oracle SQL 不使用 % 运算符打印偶数 ID
- unix - 从 txt 文件 3 中获取在 unix 中得分最高的学生的姓名?
- c# - 铸造通用 EntityFramework 核心表达式
- python - 如何根据条件创建多个新数据框,这些数据框是主数据框的子集并动态唯一地命名它们?
- python - 更改 DataFrame 的副本
- python - 从 sys 导入 exit 是运行内置函数还是模块中的函数?
- angular - 为什么以角度格式或矩格式格式化日期从日期开始随着时间 T00:00:00.000Z 减少
- reactjs - 将 dom 从子组件更新到父组件