首页 > 解决方案 > 如何解决“crossPaths := false”和“+publish”之间的交互?

问题描述

我有一个 build.sbt 文件,我在其中定义了一个仅限 java 的子项目。所以在那个子项目中,我设置crossPaths := false了 scala 版本不包含在工件名称中。

这是可行的,但是,如果我调用sbt +publish,它将为两个版本的 scala 运行发布任务,并且由于它忽略工件名称中的 scala 版本,因此发布在第二个 scala 交叉版本上遇到错误,因为在第一个版本上生成了同名的工件。

我可以通过允许在发布时覆盖来绕过它,但这有点难看,因为它不必要地重新生成工件,并且由于其他原因覆盖可能是不安全的。

我正在寻找一种在逻辑上等同于skip in publish := false除第一个版本之外的所有 scala 版本的方法,特别是在 java 子项目中,但不是 scala 子项目。

标签: scalasbt

解决方案


我添加了使用 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
  )
  1. crossScalaVersions必须Nil在聚合项目(例如root.
  2. Java 子项目应该只有一个 Scala 版本crossScalaVersions以避免重复发布,通常是scala212.
  3. Scala 子项目可以有多个 Scala 版本crossScalaVersions,但必须避免聚合 Java 子项目。

推荐阅读