"Repository for publishing is not specified" 尽管发布成功

"Repository for publishing is not specified" despite publishing succeeding

我的大型 SBT 项目中有一个单独的 Settings.scala 文件,其中包含以下内容:

lazy val commonSettings = Seq(
  // ... lots of settings
  publishTo :=
    Some("Sonatype Nexus Repository Manager" at
      "http://my.company.nexus/content/repositories/releases/"),
  credentials += Credentials(Path.userHome / ".ivy2" / ".credentials"),
  publishMavenStyle := true,
  crossScalaVersions := Seq("2.10.6"),
  // ... lots of other settings
)

现在我在 build.sbt 中的所有项目都定义如下:

lazy val aProject =
  project.in(file("somewhere/aProject")).
    settings(commonSettings).
    settings(
      // project specific settings
    )

当我现在做的时候

sbt "+ publish"

我看到我的所有工件都已发布,当我查看我的 Nexus 时,它们就在那里,我也可以将它们用作依赖项等,因此发布工作正常,但最后我得到以下信息:

java.lang.RuntimeException: Repository for publishing is not specified.
    at scala.sys.package$.error(package.scala:27)
    at sbt.Classpaths$$anonfun$getPublishTo.apply(Defaults.scala:1470)
    at sbt.Classpaths$$anonfun$getPublishTo.apply(Defaults.scala:1470)
    at scala.Option.getOrElse(Option.scala:120)
    at sbt.Classpaths$.getPublishTo(Defaults.scala:1470)
    at sbt.Classpaths$$anonfun.apply(Defaults.scala:1150)
    at sbt.Classpaths$$anonfun.apply(Defaults.scala:1150)
    at scala.Function1$$anonfun$compose.apply(Function1.scala:47)
    at sbt.$tilde$greater$$anonfun$$u2219.apply(TypeFunctions.scala:40)
    at sbt.std.Transform$$anon.work(System.scala:63)
    at sbt.Execute$$anonfun$submit$$anonfun$apply.apply(Execute.scala:226)
    at sbt.Execute$$anonfun$submit$$anonfun$apply.apply(Execute.scala:226)
    at sbt.ErrorHandling$.wideConvert(ErrorHandling.scala:17)
    at sbt.Execute.work(Execute.scala:235)
    at sbt.Execute$$anonfun$submit.apply(Execute.scala:226)
    at sbt.Execute$$anonfun$submit.apply(Execute.scala:226)
    at sbt.ConcurrentRestrictions$$anon$$anonfun.apply(ConcurrentRestrictions.scala:159)
    at sbt.CompletionService$$anon.call(CompletionService.scala:28)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)

我的 sbt 文件中遗漏了什么/做错了什么?

If a project is not defined for the root directory in the build, sbt creates a default one that aggregates all other projects in the build.

我怀疑您没有定义根项目,所以 SBT 定义了它自己的项目,当然它没有获得通用设置。 + publish SBT 尝试发布它,首先发布它聚合的所有项目(成功),然后未能发布聚合项目本身。

要解决此问题,可以:

  1. 只需定义根项目并明确给出所需的设置(它们不一定相同:那里实际上没有要发布的内容,因此您可能需要 publishArtifact := false);

  2. 进行设置global

    publishTo in ThisBuild := ...
    

另见 What is the difference between ThisBuild and Global scopes?

不幸的是,有些构建 publishArtifact := false 不会阻止发布(例如使用来自 sbt-pgp 插件的 publishSigned),您仍然会遇到 root/*:publishSignedConfiguration) Repository for publishing is not specified 错误。

SBT issue 3136 建议 skip in publish := true 是禁用项目中所有发布的更好设置 activity 截至 2017 年 10 月 (SBT 1.0.3)。