Как обойти взаимодействие между «crossPaths: = false» и «+ publish»? - PullRequest
0 голосов
/ 17 ноября 2018

У меня есть файл build.sbt, в котором я определил подпроект только для java. Поэтому в этом подпроекте я установил crossPaths := false, чтобы версия scala не включалась в имена артефактов.

Это работает, насколько это возможно, однако, если я вызываю sbt +publish, он запускает задачу публикации для двух версий scala, и, поскольку он игнорирует версию scala в именах артефактов, публикация вызывает ошибку на вторая версия Scala Cross, так как артефакты с тем же именем были созданы в первой версии.

Я могу взломать его, разрешив перезапись при публикации, но это несколько уродливо, поскольку он без необходимости заново генерирует артефакты, а перезапись может быть небезопасной по другим причинам.

Я ищу способ сделать что-то логически эквивалентное skip in publish := false для всех версий Scala, кроме первой, и конкретно в подпроекте Java, но не в подпроектах Scala.

Ответы [ 2 ]

0 голосов
/ 03 января 2019

Я добавил документацию для Кросс-компоновка с 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 mustдля агрегирующих проектов, таких как root.
  2. , в crossScalaVersions должна быть ровно одна версия Scala в *1019*, чтобы избежать двойной публикации, обычно scala212.
0 голосов
/ 18 ноября 2018

То, что следует, может быть скорее обходным путем, но позволяет публиковать и относительно легко понять:

В проекте верхнего уровня вы можете установить configure(aggregate in publish := false). Это позволяет большинству задач распространяться на подпроект java как обычно, но задача публикации не распространяется, и поэтому вы можете контролировать публикацию для каждого проекта. Теперь подпроект java можно опубликовать ровно один раз, используя publish вместо +publish:

sbt java_subproject/publish
sbt +top_level_project/publish

Недостатком этого подхода является то, что если у вас есть несколько подпроектов, каждый из них должен быть опубликован отдельно:

sbt +sub_project_1/publish
sbt +sub_project_2/publish
...
sbt java_subproject/publish
sbt +top_level_project/publish

Если вы хотите получить фантазию, вы можете вставить подпроект shim для любых подпроектов java и сделать проекты java подпроектом этого shim, а затем настроить aggregate in publish := false в shim. С этой организацией вы можете сделать:

sbt java_shim_project/publish   // publish java projects exactly once
sbt +top_level_project/publish  // publish regular scala projects as usual
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...