2013-06-19 17 views
23

Funkcja SBT uruchamia funkcję rozwiązywania problemów za każdym razem po clean, nawet jeśli konfiguracja zarządzania zależnościami projektu nie uległa zmianie. Jest to czasochłonne podczas działania na serwerze CI.Dlaczego sbt uruchamia rozwiązanie zależności za każdym razem po czyszczeniu?

Ale dokumentacja says:

  1. Zwykle, jeśli żadna konfiguracja zarządzanie zależność uległa zmianie od ostatniego pomyślnego rozwiązania, a pobrane pliki są nadal obecne , SBT nie pyta Ivy wykonywać uchwały.

Jak mogę powstrzymać od robienia SBT rozdzielczość zależność każdym razem budować projekt z sbt clean publish-local?

Aktualizacja

Odkryłam, że SBT prowadzi również uchwałę kiedy wprowadzić w trybie interaktywnym z sbt.

Update2

Jak @Ezhik wskazał, czy mogę zachować target/resolution-cache następnie SBT nie rozwiąże zależności od czystości. Więc starałem się poruszać resolution-cache się z docelowym reż:

ivyConfiguration <<= (externalResolvers, ivyPaths, offline, checksums, appConfiguration, target, streams) map { (rs, paths, off, check, app, t, s) => 
     val resCacheDir = t/".."/"resolution-cache" 
     new InlineIvyConfiguration(paths, rs, Nil, Nil, off, Option(lock(app)), check, Some(resCacheDir), s.log) 
     } 

Teraz z tego kodu w Build.scala rozdzielczości cache jest umieszczony w katalogu głównym projektu i dlatego jest zachowana po clean, ale rozdzielczość jest wykonywana tak. Zakładam więc, że takie podejście jest niewłaściwe lub niewystarczające.

Odpowiedz

9

, który zawiera raporty Ivy. Oczywistym jest, że usuwasz całą zawartość target podczas operacji clean.

IMHO Musisz wskazać w swoim projekcie gdzieś od target, jeśli chcesz zachować stan rozdzielczości.

Zaktualizowano.

vs SBT.0.12.4.RC1

  1. Znajdź gdzie resolution-cache służy - w IvyConfiguration
  2. Sprawdź gdzie IvyConfiguration się - w ramach projektu

    > inspect ivy-configuration 
    [info] Task: sbt.IvyConfiguration 
    [info] Description: 
    [info] General dependency management (Ivy) settings, such as the resolvers and paths to use. 
    [info] Provided by: 
    [info] {file:/home/ezh/projects/sbt/}xsbt/*:ivy-configuration 
    [info] Dependencies: 
    [info] xsbt/*:offline 
    
  3. naprawić w build.sbt.

    ivyConfiguration <<= (ivyConfiguration, baseDirectory) map { 
        case (c: InlineIvyConfiguration, b) => import c._ 
        new InlineIvyConfiguration(paths, resolvers, otherResolvers, moduleConfigurations, 
        localOnly, lock, checksums, resolutionCacheDir.map(_ => b/"123"), log) 
        case (other, _) => other // something unknown 
    } 
    

4 Test ... Ups ... rozdzielczości jest nadal aktywny ... Zbadaj. ->

target/scala-2.10/cache/default-920e5d/global/update/output cache zawierać odnośniki do resolution-cache :)

  1. naprawić.

    cacheDirectory <<= baseDirectory/"234" 
    

testowy. Rozumiem. Rozdzielczość jest pomijana.

zmiany Podsumowanie dla wymaganej konfiguracji:

ivyConfiguration <<= (ivyConfiguration, baseDirectory) map { 
    case (c: InlineIvyConfiguration, b) => import c._ 
    new InlineIvyConfiguration(paths, resolvers, otherResolvers, moduleConfigurations, 
    localOnly, lock, checksums, resolutionCacheDir.map(_ => b/"123"), log) 
    case (other, _) => other // something unknown 
} 
cacheDirectory <<= baseDirectory/"234" 

vs SBT.0.13.x

@deprecated("Use the cacheDirectory provided by streams.", "0.13.0") 

https://github.com/sbt/sbt/issues/1208

+0

Jak mogę to zrobić? –

+0

Zobacz moją aktualizację do pytania –

+1

Własnymi rękami? SBT jest bardzo ekspresyjny. OK specjalnie dla ciebie :))) A dla mnie jako zabawny przypadek. – Ezhik

6

Może być tak, że masz zależności SNAPSHOT. W każdej chwili mogą ulec zmianie, więc muszą zostać rozwiązane przy każdym uruchomieniu. Można to zlikwidować za pomocą

offline := true 
+0

Jestem świadomy migawek. Tak nie jest. Sbt uruchamia rozwiązanie dla wszystkich dostępnych zależności. –

+0

Przepraszamy, gdzie powinienem zastosować ten wiersz kodu build.sbt? Czy mógłbyś podać jakiś kontekst ... – khebbie

+0

@khebbie uruchom 'set offline: = true' w linii poleceń sbt (REPL) LUB uruchom sbt z' sbt "set offline: = true" uruchom ". Teoretycznie możesz dodać to również do pliku build.sbt, ale wtedy zawsze będziesz musiał edytować plik kompilacji, aby przełączyć tryb offline. –

4

Można zapobiec clean z usunięciem niektórych plików z tego ustawienia:

// path should be adapted for newer sbt versions 
cleanKeepFiles <+= cacheDirectory/"update" 
+0

Nie działa z 0.13.1. – Golly

5

To działa dla mnie na 0.13.1.

cleanKeepFiles ++= Seq("resolution-cache", "streams").map(target.value/_) 
+0

Nie działa dla mnie w wersji 0.13.1. –

+0

działa dla mnie w wersji 0.13.2, musisz dodać tę linię do wszystkich podprojektów indywidualnie – sam

Powiązane problemy