【问题标题】:"Repository for publishing is not specified" despite publishing succeeding尽管发布成功,但“未指定发布的存储库”
【发布时间】:2016-03-04 01:30:03
【问题描述】:

我的大型 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$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 文件中遗漏了什么/做错了什么?

【问题讨论】:

    标签: scala sbt nexus


    【解决方案1】:

    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?

    【讨论】:

    • 好的,所以我必须定义一个根项目。现在我的项目有一大堆子项目。我怎样才能避免写lazy val root = project.in(file(".")).aggregate(project1, project2, project3, ..., project739672)?有没有“聚合所有”的方法?
    • 我现在添加了一个根项目并使用 shell 脚本构建了大型 aggregate
    • 对不起,我不知道。你应该把它作为一个单独的问题来问。我添加了一个不需要明确定义根项目的替代方案,前提是您想在那里应用默认设置。
    • 我问了一个单独的问题,并将您的答案标记为已接受,因为它成功了。谢谢。
    【解决方案2】:

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

    SBT issue 3136 建议 skip in publish := true 是一个更好的设置,用于在 2017 年 10 月 (SBT 1.0.3) 中禁用项目中的所有发布活动。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-11-26
      • 2020-09-22
      • 2014-12-05
      • 2021-12-11
      • 2017-08-28
      • 2017-10-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多