scala - 如何解决“crossPaths := false”和“+publish”之间的交互?
问题描述
我有一个 build.sbt 文件,我在其中定义了一个仅限 java 的子项目。所以在那个子项目中,我设置crossPaths := false
了 scala 版本不包含在工件名称中。
这是可行的,但是,如果我调用sbt +publish
,它将为两个版本的 scala 运行发布任务,并且由于它忽略工件名称中的 scala 版本,因此发布在第二个 scala 交叉版本上遇到错误,因为在第一个版本上生成了同名的工件。
我可以通过允许在发布时覆盖来绕过它,但这有点难看,因为它不必要地重新生成工件,并且由于其他原因覆盖可能是不安全的。
我正在寻找一种在逻辑上等同于skip in publish := false
除第一个版本之外的所有 scala 版本的方法,特别是在 java 子项目中,但不是 scala 子项目。
解决方案
我添加了使用 Java 项目进行交叉构建的文档。
当交叉构建涉及纯 Java 项目时,必须特别小心。假设在下面的示例中,
network
是一个 Java 项目,并且core
是一个依赖于网络的 Scala 项目。
lazy val scala212 = "2.12.8"
lazy val scala211 = "2.11.12"
lazy val supportedScalaVersions = List(scala212, scala211)
ThisBuild / organization := "com.example"
ThisBuild / version := "0.1.0-SNAPSHOT"
ThisBuild / scalaVersion := scala212
lazy val root = (project in file("."))
.aggregate(network, core)
.settings(
// crossScalaVersions must be set to Nil on the aggregating project
crossScalaVersions := Nil,
publish / skip := false
)
// example Java project
lazy val network = (project in file("network"))
.settings(
// set to exactly one Scala version
crossScalaVersions := List(scala212),
crossPaths := false,
autoScalaLibrary := false,
// other settings
)
lazy val core = (project in file("core"))
.dependsOn(network)
.settings(
crossScalaVersions := supportedScalaVersions,
// other settings
)
crossScalaVersions
必须Nil
在聚合项目(例如root
.- Java 子项目应该只有一个 Scala 版本
crossScalaVersions
以避免重复发布,通常是scala212
.- Scala 子项目可以有多个 Scala 版本
crossScalaVersions
,但必须避免聚合 Java 子项目。
推荐阅读
- android - 为什么 Android 不使用最新的 gradle 版本?
- python - aiohttp、asyncio 和 RuntimeError:会话已关闭
- r - 如何将 PSPP 表重塑为另一种形式的表
- python - 如何创建从 python signalr 客户端到 ASP.NET Web 应用程序的套接字连接?
- visual-studio - 带有 TFS 的 Visual Studio:如何避免部署错误?
- java - 如何使用密码解密私钥(字符串) - java
- azure-active-directory - Asp.Net 托管 Blazor + Azure AD 身份验证
- python - 使用令牌从 Python 向 Firebase 发送通知
- react-native - headerLeft 在 reactNavigation V3 中不起作用
- python - 打开命令提示符的程序