2011-09-13 4 views
5

Chcę zdefiniować zadanie, które wywołuje zadania kompilacji i pakietów, a następnie robi swoje rzeczy. Jak mogę to zrobić? Obecnie działa tylko druga część i pomija kompilację & zadań pakietBin.Jak polegać na innych zadaniach i wykonywać swój kod w SBT 0.10?

lazy val dist = TaskKey[Unit](
    "dist", "Creates a project distribution in dist/ folder." 
) 
def distTask = { 
    dist <<= dist.dependsOn(compile, packageBin) 
    dist <<= (update, crossTarget).map { case (updateReport, out) => 
    updateReport.allFiles.foreach { srcPath => 
     val destPath = out/"lib"/srcPath.getName 
     IO.copyFile(srcPath, destPath, preserveLastModified=true) 
    } 
    } 
} 
+0

O ile obejście problemu udało mi się użyć: ~; compile; package; dist task – arturaz

Odpowiedz

3

<<= to metoda na TaskKey, która zwraca wartość. Nie aktualizuje stanu zmiennego w dowolnym miejscu, więc w przykładowym kodzie wynik pierwszego połączenia jest odrzucany. Aby to naprawić, zadeklaruj również packageBin jako dane wejściowe, ale zignoruj ​​wynikową wartość. Zauważ, że packageBin zależy od kompilacji, więc w zależności od kompilacji nie jest konieczne.

dist <<= (update, crossTarget, packageBin in Compile) map { (updateReport, out, _) => 

Jest mało prawdopodobne, że chcesz skopiować wszystkie pliki w UpdateReport do katalogu opartego wyłącznie na nazwę pliku. W różnych zależnościach można mieć tę samą nazwę pliku. Obejmuje to również zależności od wszystkich konfiguracji, w tym zależności testowych.

Dla pierwszego problemu użyj skojarzonego ModuleID, aby utworzyć ścieżkę w katalogu docelowym, tak jak to zrobiono w katalogu lib_managed, gdy retrieveManaged := true. W przypadku drugiego problemu wybierz tylko pliki wymaganej konfiguracji.

updateReport.matching(configurationFilter(Runtime.name)).foreach... 

Zobacz sbt.UpdateReport i sbt.RichUpdateReport Dokumentacja API dla innych przydatnych metod.

Jeśli nie chodzi o kolizje nazw plików, można uzyskać pliki zależności z dependencyClasspath. Na przykład:

dist <<= (crossTarget, packageBin in Compile, dependencyClasspath in Runtime) map { (out, _, cp) => 

i uzyskać Seq[File] z cp.files.

+0

Dzięki za wspaniałą odpowiedź. Jednak gdy próbuję dodać pakietBin jako zależność, otrzymuję to: [błąd] sbt.Init $ Uninitialized: Odniesienie do niezainicjowanego ustawienia {plik:/home/arturas/work/spacegame/server/vendor/SpaceMule /} SpaceMule/*: pakiet z {file:/home/arturas/work/spacegame/server/vendor/SpaceMule /} SpaceMule/*: dist [error] Użyj "last" dla pełnego logu. – arturaz

+0

Czy uwzględniono część "w kompilacji"? –

+1

Och, chyba go przegapiłem. Działa teraz, dzięki :) – arturaz

Powiązane problemy