Scala &引用;未指定用于发布的存储库";尽管出版成功

Scala &引用;未指定用于发布的存储库";尽管出版成功,scala,sbt,nexus,Scala,Sbt,Nexus,在我的大型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 += Cr

在我的大型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
)
lazy val aProject =
  project.in(file("somewhere/aProject")).
    settings(commonSettings).
    settings(
      // project specific settings
    )
现在,我在
build.sbt
中的所有项目定义如下:

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
)
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$1.apply(Defaults.scala:1470)
    at sbt.Classpaths$$anonfun$getPublishTo$1.apply(Defaults.scala:1470)
    at scala.Option.getOrElse(Option.scala:120)
    at sbt.Classpaths$.getPublishTo(Defaults.scala:1470)
    at sbt.Classpaths$$anonfun$59.apply(Defaults.scala:1150)
    at sbt.Classpaths$$anonfun$59.apply(Defaults.scala:1150)
    at scala.Function1$$anonfun$compose$1.apply(Function1.scala:47)
    at sbt.$tilde$greater$$anonfun$$u2219$1.apply(TypeFunctions.scala:40)
    at sbt.std.Transform$$anon$4.work(System.scala:63)
    at sbt.Execute$$anonfun$submit$1$$anonfun$apply$1.apply(Execute.scala:226)
    at sbt.Execute$$anonfun$submit$1$$anonfun$apply$1.apply(Execute.scala:226)
    at sbt.ErrorHandling$.wideConvert(ErrorHandling.scala:17)
    at sbt.Execute.work(Execute.scala:235)
    at sbt.Execute$$anonfun$submit$1.apply(Execute.scala:226)
    at sbt.Execute$$anonfun$submit$1.apply(Execute.scala:226)
    at sbt.ConcurrentRestrictions$$anon$4$$anonfun$1.apply(ConcurrentRestrictions.scala:159)
    at sbt.CompletionService$$anon$2.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文件中遗漏了什么/做错了什么

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

要解决此问题,请执行以下操作之一:

  • 只需定义根项目并显式地给出所需的设置(它们不一定相同:实际上没有要发布的内容,因此您可能希望
    publishArtifact:=false

  • 进行以下设置:


  • 另请参见

    不幸的是,有些构建中,
    publishArtifact:=false
    不会阻止发布(例如使用sbt pgp插件中的
    publishSigned
    ),并且您仍然可以获得
    root/*:publishSignedConfiguration)未指定发布的存储库
    错误


    建议从2017年10月(SBT 1.0.3)起禁用项目中的所有发布活动时,使用
    跳过发布:=true
    是一个更好的设置。

    好,因此我必须定义一个根项目。现在我的项目有一大堆子项目。如何避免在(文件(“.”)聚合(project1、project2、project3、…、project739672)中写入
    lazy val root=project.in
    ?有“聚合所有”方法吗?我现在添加了一个根项目,并使用shell脚本构建了一个大型的
    aggregate
    。对不起,我不知道。你应该单独提问。我添加了一个不需要显式定义根项目的替代方案,前提是您要在那里应用默认设置。我问了一个单独的问题,并将您的答案标记为已接受,因为这样做了。非常感谢。