2015-09-29 21 views
7

Sul mio computer locale ho una cache dell'edera che è stata riempita lavorando su più progetti.Come testare i resolver sbt

Una libreria X viene caricata utilizzando il resolver Y nel progetto A. Questa stessa libreria X viene utilizzata nel progetto B, senza problemi di risoluzione di questa libreria perché è nella mia cache locale.

Quando uno dei miei colleghi carica il progetto B ottiene l'errore che la libreria X non può essere risolta. Il problema: il resolver Y manca.

Come posso verificare se il mio progetto sbt ha un set completo di resolver per risolvere tutte le dipendenze senza rimuovere la mia ivy cache?

+0

Per chiarire, la tua domanda: vuoi vedere sul progetto 'B' che il risolutore' Y' è mancante, anche se hai le dipendenze necessarie nella cache locale? Ho ragione? –

+0

Se ho capito bene, avresti bisogno di qualcosa come il task 'sbt update' ([facente parte dell'elenco delle attività predefinite] (http://www.scala-sbt.org/0.13/docs/Howto-Inspect- the-Build.html # List + available + tasks)) ma dicendo esplicitamente a 'sbt' di non usare alcuna cache per risolvere le dipendenze. Nelle dipendenze di SNAPSHOT questo sembra essere il caso di default dato [questa risposta] (http://stackoverflow.com/a/24510450/3165552). Il primo commento sottolinea anche che potrebbe essere possibile attenuare questa restrizione con l'opzione 'def changing()' sul sito della dichiarazione delle dipendenze. –

+0

È possibile controllare le opzioni [Caching e risoluzione] (http://www.scala-sbt.org/0.13/docs/Dependency-Management-Flow.html#Caching+and+Configuration), come proposto da [questa risposta] (http://stackoverflow.com/a/26655891/3165552) –

risposta

2

Questo comando consente di trovare se vi manca qualsiasi aggiornamento per il progetto corrente. Nota che questo non scoprirà alcun risolutore mancante per i tuoi plugin.

commands += Command.command("testUpdate") { state => 
    val base = baseDirectory.value 
    val newState = Project 
    .extract(state) 
    .append(Seq(ivyPaths := new IvyPaths(base, Some(base/"tmp-cache"))), state) 
    val (s, _) = Project 
    .extract(newState) 
    .runTask(update, newState) 
    s 
} 

Potrebbe essere espanso rimuovendo la directory in seguito.

+0

Congratulazioni e grazie;) ma avrei una leggera aggiunta a causa di convenzioni comuni. 'sbt tasks' elenca un elenco di attività disponibili che mostra che i compiti predefiniti utilizzano tutti il ​​rivestimento cammello per i loro nomi. L'utilizzo di trattini mi ricorda fortemente l'utilizzo di Maven. Avere trattini nei nomi potrebbe anche essere un problema quando si chiama l'attività all'interno di un file build.scala. –

+0

@isi Ho cambiato il nome in base al tuo suggerimento. Da parte non: state attenti a non confondere i comandi con le attività. – EECOLOR

+0

Per quanto riguarda la nota a margine: mentre leggevo il tuo commento e mi immergevo nella documentazione, mi è stato chiaro che non è così facile da ottenere e ho fatto una domanda per chiarirlo. –

1

Ho trovato una soluzione di lavoro dichiaratamente semplice ma anche un po 'hacky e nondimeno. As described here è possibile impostare la directory home dell'edera. Dopo averlo configurato provocherà le istanze di sbt sul tuo sistema per aggiornare le dipendenze , a causa di una nuova directory della cache. Quando tutte le dipendenze potrebbero essere risolte, è possibile ispezionare lo std per alcune stringhe che indicano il successo. Come Done updating. e successivamente elimina la cartella temporale. Attenzione, una nuova risoluzione da zero potrebbe richiedere un po 'di tempo! ~ 5min 100Mbit/s ed utilizzando un disco SSD

Invece di definire il sistema variabile sbt.ivy.home ampio e in modo alquanto portabile vi consiglio di utilizzare l'opzione invasivo sistema meno di definizione della variabile sbt.ivy.home all'interno della variabile ambiente SBT_OPTS sulla il tuo comando locale/sessione terminale. Su Windows questo appare come segue:

C:\Users\isi\Projects\learning\sbt-test-dependencies>SET SBT_OPTS=-Dsbt.ivy.home="C:\path\to\your\temp\directory" 

C:\Users\isi\Projects\learning\sbt-test-dependencies>sbt 
Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize=256m; support was removed in 8.0 
[info] Loading project definition from C:\Users\isi\Projects\learning\sbt-test-dependencies\project 
[info] Updating {file:/C:/Users/isi/Projects/learning/sbt-test-dependencies/project/}sbt-test-dependencies-build... 
[info] Resolving org.fusesource.jansi#jansi;1.4 ... 
[info] downloading https://repo.scala-sbt.org/scalasbt/sbt-plugin-releases/com.typesafe.sbteclipse/sbteclipse-plugin/scala_2.10/sbt_0.13/4.0.0/jars/sbteclipse-plugin.jar ... 
[info] [SUCCESSFUL ] com.typesafe.sbteclipse#sbteclipse-plugin;4.0.0!sbteclipse-plugin.jar (4783ms) 
... 
[info] downloading https://jcenter.bintray.com/org/scala-lang/jline/2.10.5/jline-2.10.5.jar ... 
[info] [SUCCESSFUL ] org.scala-lang#jline;2.10.5!jline.jar (419ms) 
[info] downloading https://jcenter.bintray.com/org/fusesource/jansi/jansi/1.4/jansi-1.4.jar ... 
[info] [SUCCESSFUL ] org.fusesource.jansi#jansi;1.4!jansi.jar (325ms) 
[info] Done updating. 
[info] Set current project to sbt-test-dependencies (in build file:/C:/Users/isi/Projects/learning/sbt-test-dependencies/)/Users/isi/Projects/learning/sbt-test-dependencies/) 

L'uscita può essere convogliata al permette di dire grep e il codice di uscita può essere utilizzata per l'ulteriore elaborazione. Si noti che l'output della console sopra è stato prodotto utilizzando il comando interattivo sbt, un output simile viene generato utilizzando il comando non interattivo sbt update.

2

Un'altra soluzione ancora più elegante sarebbe quella di esaminare le fonti SBT se è possibile configurare facilmente questo comportamento come attività separata. I passaggi necessari potrebbero essere gli stessi di my other answer.

  1. parametri estratto sbt.ivy.home da update compito e fornire un sovraccarico di parametri per esso (se questo è possibile)
  2. definire nuovi testDependencies attività see documentation
  3. Creare tempDirectory
  4. aggiornamento Call (tempDirectory)
  5. Raccogliere risultati
  6. Rimuovi tempDirectory
  7. Res promozione ULT
  8. Fornire una richiesta di pull;) o un plugin SBT
+0

Sembra una buona idea, lo proverò – EECOLOR

+0

Sembra 'ivyPaths: = new IvyPaths (baseDirectory.value, Some (baseDirectory.value /" tmp-cache "))" fa il trucco. Ora ho solo bisogno di capire come creare un'attività personalizzata che esegua 'update' con quell'impostazione. – EECOLOR

+0

Grazie per il vostro aiuto. Ho aggiunto un 'comando' come risposta, ma ho assegnato il premio alla tua risposta. – EECOLOR

1

Ora è disponibile un plug-in SBT, denominato SBT dirty money, per aggiungere funzionalità aggiuntive per affrontare questo problema. Sebbene tu debba eseguire un comando extra.

+0

"senza rimuovere la mia cache di edera" - il plugin cancella le dipendenze dalla cache - dal momento che le aggiungerai direttamente per testarlo non sarà comunque un problema. – EECOLOR

+0

Sì, significa che devi scaricare di nuovo tutto. Rendere questa parte della fase di rilascio garantisce la risoluzione, ma aggiunge diversi minuti di tempo di costruzione. Ciò che è più importante, assicurandosi che tutto sia risolto o una build veloce che potrebbe fallire. Quando si utilizzano i server di generazione, è possibile creare un passaggio aggiuntivo per il test e l'accettazione per testare i risolutori e saltarlo per la produzione. Ma questa è interamente la tua scelta. – Jork

Problemi correlati