2015-11-30 18 views
6

Ho un file separato Settings.scala nel mio grande progetto SBT che ha la seguente:"Repository per la pubblicazione non è specificato", nonostante la pubblicazione di successo

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 
) 

Ora tutti i miei progetti in build.sbt sono definiti i seguenti:

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

Quando io ora faccio

sbt "+ publish" 

I se e che tutti i miei manufatti vengono pubblicati, e quando guardo nel mio Nexus sono lì, e posso anche usarli come dipendenze, ecc, quindi la pubblicazione di opere, ma comunque ottengo il seguente alla fine:

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) 

Cosa mi sfugge/faccio male nel mio file sbt?

risposta

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.

ho il sospetto che non si definisce un progetto di primo livello, in modo da SBT definisce il proprio e, naturalmente, non ottiene le impostazioni comuni. Con + publish SBT tenta di pubblicarlo, inizia con la pubblicazione di tutti i progetti che aggrega (che riesce) e quindi non riesce a pubblicare il progetto aggregato stesso.

Per risolvere questo problema, sia:

  1. solo definire il progetto principale e dare le impostazioni desiderate esplicitamente (e non sono necessariamente la stessa: non c'è nulla in realtà di pubblicare lì, quindi probabilmente si desidera publishArtifact := false);

  2. Effettuare le impostazioni global:

    publishTo in ThisBuild := ... 
    

Vedi anche What is the difference between ThisBuild and Global scopes?

+0

OK, quindi devo definire un progetto root. Ora il mio progetto ha un grosso gruppo di sottoprogetti. Come posso evitare di scrivere 'lazy val root = project.in (file (". ")). Aggregate (project1, project2, project3, ..., project739672)'? Esiste un metodo "aggregate all"? – rabejens

+0

Ora ho aggiunto un progetto root e ho costruito il grande 'aggregato' usando uno script di shell. – rabejens

+0

Scusa, non lo so. Dovresti chiederlo come una domanda separata. Ho aggiunto un'alternativa che non richiede la definizione esplicita del progetto di root, a condizione che si desideri applicare le impostazioni predefinite lì. –

1

Purtroppo non build dove publishArtifact := false non impedisce la pubblicazione (come l'utilizzo di plug-in publishSigned da SBT-PGP) e puoi ancora ricevere errori root/*:publishSignedConfiguration) Repository for publishing is not specified.

SBT issue 3136 suggerisce skip in publish := true è un'impostazione migliore per disabilitare tutte le attività di pubblicazione in un progetto a partire da ottobre 2017 (SBT 1.0.3).