Pytanie Jak uzyskać podprojekt SBT z wieloma wersjami Scali?


Mam projekt przy użyciu Scala 2.10 i jeden przy użyciu Scala 2.11. Zależą od wspólnego projektu, który można skompilować z obydwoma.

lazy val foo = (project in file("foo")).dependsOn(baz).settings(
  scalaVersion := "2.10.4"
)

lazy val bar = (project in file("bar")).dependsOn(baz).settings(
  scalaVersion := "2.11.4"
)

lazy val baz = (project in file("baz")).settings(
  crossScalaVersions := Seq("2.10.4", "2.11.4"),
  scalaVersion := "2.10.4"
)

I wtedy

$ sbt bar/update
[info] Updating {file:/home/paul/Private/test/}bar...
[info] Resolving baz#baz_2.11;0.1-SNAPSHOT ...
[warn]  module not found: baz#baz_2.11;0.1-SNAPSHOT
[warn] ==== local: tried
[warn]   /home/paul/.ivy2/local/baz/baz_2.11/0.1-SNAPSHOT/ivys/ivy.xml
[warn] ==== public: tried
[warn]   http://repo1.maven.org/maven2/baz/baz_2.11/0.1-SNAPSHOT/baz_2.11-0.1-SNAPSHOT.pom
[info] Resolving jline#jline;2.12 ...
[warn]  ::::::::::::::::::::::::::::::::::::::::::::::
[warn]  ::          UNRESOLVED DEPENDENCIES         ::
[warn]  ::::::::::::::::::::::::::::::::::::::::::::::
[warn]  :: baz#baz_2.11;0.1-SNAPSHOT: not found
[warn]  ::::::::::::::::::::::::::::::::::::::::::::::
[trace] Stack trace suppressed: run last bar/*:update for the full output.
[error] (bar/*:update) sbt.ResolveException: unresolved dependency: baz#baz_2.11;0.1-SNAPSHOT: not found
[error] Total time: 1 s, completed Jan 13, 2015 11:42:51 AM

Jak mogę mieć baz do wykorzystania przez oba projekty?


11
2018-01-13 18:45


pochodzenie


Czy próbowałeś crossPaths := false opcję, aby w ogóle zignorować wersje scala? - yevgeniy mordovkin
Jest szansa, że ​​będziesz miał problemy z porównywalnością (nie 100%), ale szczerze mówiąc twoja sytuacja i tak źle pachnie; więc proponuję to jako tymczasową poprawkę, dopóki nie zrobisz tego bla i baz użyj 2.11.4 oba. - yevgeniy mordovkin


Odpowiedzi:


Proponowane przez Jewgienija Mordowina rozwiązanie crossPaths := false w projekcie baz działa.

Inną rzeczą, którą możesz zrobić, jest przedrostek + przed poleceniem: sbt '+ bar/update'. To się zbuduje baz dla wszystkich deklarowanych wersji Scala.


7
2018-01-26 09:13



Dzięki. (1) Będzie crossPaths powodować problemy, skoro mniejsze wersje Scala nie są kompatybilne z binariami? (2) Wydaje się, że + do pracy, muszę też dodać crossVersions do bari przełączaj projekty za pomocą project bar i wtedy +update (zamiast +bar/update), w przeciwnym razie używa 2.10. - Paul Draper
@PaulDraper nie trzeba dodawać crossScalaVersions do bar. To, co musisz zrobić, to ustawić settings przed deklaracją dependsOn: lazy val bar = (project in file("bar")).settings(scalaVersion := "2.11.4").dependsOn(baz). - Ionuț G. Stan
@PaulDraper, którego możesz użyć update bez poprzedzającego + wewnątrz bar o ile już skompilowałeś baz dla wszystkich deklarowanych wersji. - Ionuț G. Stan
@PaulDraper i tak, ustawienie crossPaths := false może powodować problemy na linii, więc lepiej nie używać go. - Ionuț G. Stan
@ IonuţG.Stan Niestety, wprowadzenie settings przed aggregate w ten sam sposób wydaje się nie działać. Czy oczekuje się? Widzieć stackoverflow.com/questions/27231293/... i github.com/scalan/scalan-ce/tree/include-lms-backend-in-root - Alexey Romanov


Stworzyłem Wtyczka SBT dla tego.

projekt / plugins.sbt

resolvers += Resolver.sonatypeRepo("releases")

addSbtPlugin("com.lucidchart" % "sbt-cross" % "1.0")

build.sbt

lazy val foo = (project in file("foo")).dependsOn(baz_2_10).settings(
  scalaVersion := "2.10.4"
)

lazy val bar = (project in file("bar")).dependsOn(baz_2_11).settings(
  scalaVersion := "2.11.5"
)

lazy val baz = (project in file("baz")).cross

lazy val baz_2_10 = baz("2.10.4")

lazy val baz_2_11 = baz("2.11.5")

Zajmuje kilka dodatkowych linii, ale teraz wszystko kompiluje się zgodnie z oczekiwaniami: sbt foo/compile działa, a sbt bar/compile Prace.

Nie musisz pamiętać unikalnych poleceń, z których nie masz błędów crossPath := falsei w przeciwieństwie do ++jest to możliwe do zrównoleglenia: sbt compile skompiluje foo, bar, i baz z odpowiednimi wersjami Scala jednocześnie.


2
2017-11-26 23:14



Niestety nie działa dobrze z Intellijsem, ale po uruchomieniu z sbt - szybki i niesamowity. - Tvaroh
Działa dobrze z IntelJ 2017.1.4 - Atais
@Tvaroh Myślę, że działa z Intellij tak samo dobrze lub lepiej niż jakiekolwiek inne rozwiązanie. Zgłoś błąd w projekcie Github, jeśli zauważysz, że jest inaczej. - Paul Draper
@PaulDraper działa tylko wtedy, gdy wszystkie moduły są skonfigurowane do krzyżowania. Jeśli podzbiór - nie. - Tvaroh
Czy działa dobrze w przepływie pracy przy publikowaniu pakietów? - acjay


Miałem podobną konfigurację i działa tak:

lazy val baz = (project in file("baz")).settings(
  crossScalaVersions := Seq("2.10.4", "2.11.4")
)
lazy val bar = (project in file("bar")).dependsOn(baz).settings(
  scalaVersion := "2.10.4"
)
lazy val foo = (project in file("foo")).dependsOn(baz).settings(
  scalaVersion := "2.11.4"
)

I budowanie z

sbt '++ 2.10.4 baz/compile' 'bar/compile' '++ 2.11.4 baz/compile' 'foo/compile'

0
2017-11-26 21:51