2014-08-31 12 views
8

Wpadłem na kilka powiązanych z SBT przypadków, które mnie zaskoczyły. Czy istnieje sposób, aby powiedzieć SBT, aby pomijał podprojekt w całości dla pewnych wersji scala podczas kompilacji krzyżowej?Jak przejść do kompilacji SBT dla danego podprojektu?

Oto dwa przykłady, w których byłoby to przydatne.

1) Kompilacja z trzema projektami A, B i C. Zarówno A, jak i B są projektami scala i mają "scalaVersions ++ = Seq (" 2.11.2 "," 2.10.4 ") w swoich ustawieniach . Projekt C jest artefaktem czysto Java i tym samym wykluczyłem biblioteki Scala z jego zależności. Chciałbym, żeby A i B były zależne od C, ale najlepiej chciałbym zbudować C tylko raz. Jeśli użyję domyślnego zachowania i zrobię "+ publish" z projektu agregatora root, otrzymam dwie kopie wyprodukowanego C-1.0.0.jar, a SBT spróbuje je opublikować dwa razy, co oczywiście nie jest możliwe dla repozytorium maven.

2) Kompilacja z wieloma projektami scala, ale jeden projekt powinien opierać się tylko na jednej wersji Scala. Próbowałem zdefiniować "scalaVersions" w ustawieniach dla tego projektu, aby przechowywać tylko jedną wersję, w której inne projekty mają dwa, ale znowu "+ publikuj" z głównego agregatora wydaje się ignorować to i nadal kompiluje je dwukrotnie, po raz drugi awaria, ponieważ zależności nie są dostępne dla tej wersji Scala. Ten projekt jest węzłem liścia na wykresie zależności, więc dobrze jest robić logicznie.

W przypadku nr 2, zastanawiałem się nad ustawieniem katalogów źródłowych dla "złej" wersji scala na/dev/null lub coś podobnego, ale to nadal uruchamia kompilację i tworzy pusty artefakt. Wiem, że prawdopodobnie mógł wejść i znaleźć wszystkie z odpowiednimi kluczami i zrobić coś podobnego

publishArtifact := if(scalaBinaryVersion.value == "2.10") false else publishArtifact.value 

a następnie dopaść wszystkie inne pokrewne Ustawienia/zadań (kompilować, skompilować w test, test w teście, packageBin, itd.), ale wydaje się to dość hack-owskie. Czy gdzieś jest ustawienie "pomiń"?

Odpowiedz

4

Napisałem sbt-doge w celu omówienia agregacji zadań w podprojektach z uwzględnieniem ich wersji CrossScala. W przypadku projektów Java może być potrzebny atrapa crossScalaVersion.

+0

Wygląda to bardzo użytecznie, ale szczerze mówiąc, nie mogę dodać "tak wiele testów" i takich do mojej kompilacji: -/ –

+0

I zupełnie brakowało mi "rozsądnej" alternatywy w wersji 0.1.4. Przepraszam, proszę pana! Działa to jak urok! –

+0

@ Tomer, jakie testy i "rozsądna alternatywa" masz na myśli? – matanster

1

Wtyczkę sbt-doge można użyć do określenia ustawienia crossScalaVersion w każdym podprojekcie.

Najpierw dodaj linię addSbtPlugin("com.eed3si9n" % "sbt-doge" % "0.1.5") do swojej projects/plugins.sbt.

Aby uniknąć niedorzecznej składni dołowej ("taka kompilacja", naprawdę?) Musisz enablePlugins(CrossPerProjectPlugin) w projekcie głównym. Dzięki temu możesz dodać znak plus przed poleceniami sbt, a oni będą honorować ustawienia kompilacji krzyżowej. Po prostu tak: + compile.

Powiązane problemy