2015-11-30 11 views
6

ich eine separate Settings.scala Datei in meinem großen SBT-Projekt haben die folgende hat:„Repository für die Veröffentlichung nicht angegeben“ trotz der Veröffentlichung nachfolgenden

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 
) 

Nun folgt definiert werden alle meine Projekte in build.sbt:

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

Wenn ich jetzt

sbt "+ publish" 

I se e, die alle meine Artefakte publiziert werden, und als ich sie dort zu suchen in mein Nexus, und ich kann sie auch als Abhängigkeiten usw. verwenden, so Werke zu veröffentlichen, aber trotzdem erhalte ich die folgende am Ende:

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) 

Was vermisse ich/mache ich falsch in meiner sbt-Datei?

Antwort

14

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.

Ich vermute, dass Sie keine Root-Projekt definieren, so SBT seine eigene und natürlich definiert es nicht die allgemeinen Einstellungen erhalten. Mit + publish SBT versucht, es zu veröffentlichen, beginnt mit der Veröffentlichung aller Projekte, die es aggregiert (was erfolgreich ist) und fehlschlägt, das Aggregatprojekt selbst zu veröffentlichen.

Um dies zu beheben, entweder:

  1. nur das Root-Projekt definieren und die gewünschten Einstellungen gibt explizit (und sie sind nicht unbedingt das gleiche: es gibt nichts wirklich dort zu veröffentlichen, so dass sie wahrscheinlich publishArtifact := false);

  2. Nehmen Sie die Einstellungen global:

    publishTo in ThisBuild := ... 
    

Siehe auch What is the difference between ThisBuild and Global scopes?

+0

OK, also muss ich ein Root-Projekt definieren. Jetzt hat mein Projekt ein großes, großes Bündel von Teilprojekten. Wie kann ich vermeiden, '' lazy val root = project.in (Datei (".")) Zu schreiben. Aggregate (project1, project2, project3, ..., project739672) '? Gibt es eine "aggregierte all" -Methode? – rabejens

+0

Ich habe jetzt ein Root-Projekt hinzugefügt und das große Aggregat mit einem Shell-Skript erstellt. – rabejens

+0

Sorry, ich weiß es nicht. Sie sollten es als separate Frage stellen. Ich habe eine Alternative hinzugefügt, bei der das Root-Projekt nicht explizit definiert werden muss, sofern Sie dort Standardeinstellungen anwenden möchten. –

1

Leider gibt es baut, wo publishArtifact := false nicht daran hindert, publishing (wie publishSigned von sbt-pgp-Plugin) und Sie können immer noch root/*:publishSignedConfiguration) Repository for publishing is not specified Fehler erhalten.

SBT issue 3136 schlägt vor, skip in publish := true ist eine bessere Einstellung zum Deaktivieren aller Publishing-Aktivität in einem Projekt ab Oktober 2017 (SBT 1.0.3).

Verwandte Themen