2015-11-30 31 views
6

mam oddzielny plik Settings.scala w moim dużym projekcie SBT który posiada następujące:„Repository do publikacji nie jest określony” mimo publikowania kolejnych

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 
) 

Teraz wszystkie moje projekty w build.sbt zdefiniowane są następujące:

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

Kiedy teraz zrobić

sbt "+ publish" 

ja se e, że wszystkie moje artefakty publikowane, a gdy patrzę na mojego Nexus one tam są, i mogę też wykorzystać je jako Zależności etc, więc publikując prace, ale mimo to pojawia się następujący na koniec:

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) 

Czego mi brakuje/robię źle w moim pliku sbt?

Odpowiedz

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.

Podejrzewam, że nie określają projekt korzeniowy, więc SBT definiuje własnych i oczywiście nie ma nic wspólne ustawienia. Z + publish SBT próbuje go opublikować, zaczyna od opublikowania wszystkich projektów, które agreguje (co się udaje), a następnie nie publikuje samego zagregowanego projektu.

Aby rozwiązać ten problem, albo:

  1. wystarczy zdefiniować projekt korzeniowy i dać żądane ustawienia się wyraźnie (i nie zawsze są one tak samo: nie ma nic faktycznie tam publikować, więc prawdopodobnie chcesz publishArtifact := false);

  2. Dokonaj ustawień global:

    publishTo in ThisBuild := ... 
    

Zobacz również What is the difference between ThisBuild and Global scopes?

+0

OK, więc muszę zdefiniować główny projekt. Teraz mój projekt ma dużą, WIELKĄ wiązkę podprojektu. Jak mogę uniknąć pisania 'lazy val root = project.in (file (". ")). Aggregate (project1, project2, project3, ..., project739672)'? Czy istnieje metoda "agreguj wszystko"? – rabejens

+0

Dodałem teraz projekt główny i skonstruowałem duży 'agregat' przy użyciu skryptu powłoki. – rabejens

+0

Przepraszam, nie wiem. Powinieneś zadać to jako osobne pytanie. Dodałem alternatywę, która nie wymaga jawnego definiowania projektu głównego, pod warunkiem, że chcesz zastosować tam ustawienia domyślne. –

1

Niestety buduje gdzie publishArtifact := false nie zabrania publikowania (takich jak korzystanie z wtyczki publishSigned SBT-pgp) oraz nadal możesz uzyskać błędy root/*:publishSignedConfiguration) Repository for publishing is not specified.

SBT issue 3136 sugeruje, że skip in publish := true jest lepszym ustawieniem do wyłączania wszystkich działań związanych z publikowaniem w projekcie od października 2017 (SBT 1.0.3).