2015-09-29 16 views
7

Auf meinem lokalen Computer habe ich einen Efeu-Cache, der durch die Arbeit an mehreren Projekten gefüllt wurde.So testen Sie sbt Resolver

Eine Bibliothek X wird mit dem Resolver Y im Projekt A geladen. Dieselbe Bibliothek X wird in Projekt B verwendet, keine Probleme beim Auflösen dieser Bibliothek, da sie sich in meinem lokalen Cache befindet.

Wenn einer meiner Kollegen Projekt B lädt, erhält er den Fehler, dass die Bibliothek X nicht aufgelöst werden konnte. Das Problem: Resolver Y fehlt.

Wie kann ich testen, ob mein sbt-Projekt einen vollständigen Satz von Resolvern hat, um alle Abhängigkeiten aufzulösen, ohne meinen Efeu-Cache zu entfernen?

+0

Zur Klärung, Ihre Frage: Sie wollen auf Projekt 'B' sehen, dass Resolver' Y' fehlt, obwohl Sie die notwendigen Abhängigkeiten in Ihrem lokalen Cache haben? Habe ich recht? –

+0

Wenn ich Sie richtig verstanden habe, benötigen Sie etwas wie die 'sbt update' Aufgabe ([ist Teil der Liste der Standardaufgaben] (http://www.scala-sbt.org/0.13/docs/Howto-Inspect- the-Build.html # List + available + tasks)), aber explizit 'sbt' angewiesen, kein Caching zur Auflösung der Abhängigkeiten zu verwenden. Bei SNAPSHOT-Abhängigkeiten scheint dies der Fall zu sein, wenn [diese Antwort] angegeben wird (http://stackoverflow.com/a/24510450/3165552). Der erste Kommentar weist auch darauf hin, dass es möglich sein könnte, diese Einschränkung mit dem optionalen 'def changing()' auf der Dependenzdeklarationsstelle zu mildern. –

+0

Sie können die Optionen [Caching und Auflösung] (http://www.scala-sbt.org/0.13/docs/Dependency-Management-Flow.html#Caching+und+Configuration) prüfen, wie von [diese Antwort] vorgeschlagen. (http://stackoverflow.com/a/26655891/3165552) –

Antwort

2

Dieser Befehl erlaubt Ihnen zu finden, wenn Sie keine Updates für das aktuelle Projekt fehlen. Beachten Sie, dass dabei keine fehlenden Resolver für Ihre Plugins gefunden werden.

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 
} 

Es könnte durch Entfernen des Verzeichnisses danach erweitert werden.

+0

Herzlichen Glückwunsch und Danke;) aber ich hätte eine kleine Ergänzung aufgrund der üblichen Konventionen. 'sbt tasks' listet eine Liste von verfügbaren Aufgaben auf, die zeigt, dass die vordefinierten Aufgaben alle camel casing für ihre Namen verwenden. Die Verwendung von Bindestrichen erinnert mich stark daran, maven zu verwenden. Bindestriche in Namen könnten sogar ein Problem sein, wenn Sie den Task innerhalb einer build.scala-Datei aufrufen. –

+0

@isi Ich habe den Namen basierend auf Ihrem Vorschlag geändert. Als eine Seite nicht: seien Sie vorsichtig, um Befehle nicht mit Aufgaben zu verwechseln. – EECOLOR

+0

Zu Ihrer Randnotiz: Als ich Ihren Kommentar las und in die Dokumentation eintauchte, war mir klar, dass dies nicht so einfach zu erreichen ist und ich habe eine Frage gestellt, um dies zu klären. –

1

Ich fand eine zugegebenermaßen einfache aber auch ein bisschen hacky und dennoch funktionierende Lösung. As described here Sie können das Efeu Home-Verzeichnis einrichten. Nach dem Einrichten wird es die sbt-Instanzen auf Ihrem System dazu bringen, alle Abhängigkeiten aufgrund eines neuen Cache-Verzeichnisses zu aktualisieren. Wenn alle Abhängigkeiten aufgelöst werden konnten, konnten Sie das std out nach einer Zeichenfolge suchen, die auf Erfolg hinweist. Wie Done updating. und löschen Sie den zeitlichen Ordner danach. Vorsicht, eine neue Lösung von Grund auf könnte eine Weile dauern! ~ 5min 100Mbit/s und mit einem SSD-Laufwerk

Statt Definition der sbt.ivy.home variables System breit und in einer etwas unportable Art und Weise würde ich empfehlen, die weniger System-invasive Option zur Definition der sbt.ivy.home Variable innerhalb der Umgebungsvariable zu verwenden SBT_OPTS auf Ihre lokale Befehls-/Terminalsitzung. Unter Windows sieht das wie folgt aus:

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/) 

Der Ausgang läßt geleitet werden kann, um grep sagen und der Exit-Code kann für die weitere Verarbeitung verwendet werden. Beachten Sie, dass die obige Konsolenausgabe mit dem interaktiven Befehl erstellt wurde. Eine ähnliche Ausgabe wird mit dem nicht interaktiven Befehl sbt update generiert.

2

Eine andere, noch elegantere Lösung wäre die Untersuchung der SBT-Quellen, wenn es leicht möglich ist, dieses Verhalten als separate Aufgabe einzurichten. Die notwendigen Schritte könnten die gleichen wie in my other answer sein.

  1. Extract Parameter sbt.ivy.home von update Aufgabe und eine parametrisierte Überlast dafür liefern (sofern dies möglich ist)
  2. definieren neue Aufgabe testDependencies see documentation
  3. erstellen TempDirectory
  4. Anruf update (TempDirectory)
  5. Gather Ergebnisse
  6. Entfernen tempDirectory
  7. Förderung res ultate
  8. Geben Sie eine Pull-Anforderung;) oder ein sbt Plugin
+0

Das hört sich nach einer tollen Idee an, ich werde es ausprobieren – EECOLOR

+0

Es scheint 'ivyPaths: = neue IvyPaths (baseDirectory.value, Some (baseDirectory.value /" tmp-cache "))' macht den Trick. Jetzt muss ich nur herausfinden, wie man eine benutzerdefinierte Aufgabe erstellt, die 'update' mit dieser Einstellung ausführt. – EECOLOR

+0

Vielen Dank für Ihre Hilfe. Ich habe einen "Befehl" als Antwort hinzugefügt, aber das Kopfgeld Ihrer Antwort zugewiesen. – EECOLOR

1

Es ist jetzt ein SBT-Plugin verfügbar, genannt SBT dirty money, um zusätzliche Funktionalität hinzuzufügen, um dieses Problem anzugehen. Obwohl Sie einen zusätzlichen Befehl ausführen müssen.

+0

"ohne meinen Efeu-Cache zu entfernen" - Plugin löscht die Abhängigkeiten aus dem Cache - da Sie sie direkt erneut hinzufügen werden, um es zu testen, wird es kein Problem sein. – EECOLOR

+0

Ja, es bedeutet, dass Sie alles erneut herunterladen müssen. Wenn Sie diesen Teil des Freigabeschritts vornehmen, ist die Auflösung zwar sichergestellt, es werden jedoch mehrere Minuten Bauzeit benötigt. Was noch wichtiger ist, stellen Sie sicher, dass alles gelöst ist oder ein schneller Build, der möglicherweise fehlschlägt. Wenn Sie Build-Server verwenden, möchten Sie möglicherweise einen zusätzlichen Schritt für Test und Akzeptanz erstellen, um die Resolver zu testen und für die Produktion zu überspringen. Aber das ist ganz Ihre eigene Wahl. – Jork