Mit Typesafe Config ' s ConfigFactory zu set-Taste-Einstellung in build.sbt?
sbt.version=0.13.1
In build.sbt
ich bin die Zuordnung einer Einstellung-Taste, durch Aufruf ein Stück von meinem Projekt Abhängigkeit der code, der wiederum konfiguriert sich selbst über Typesafe Config ' s ConfigFactory
. Meine Abhängigkeit hat sich ein reference.conf
im root von der jar, und mein Projekt selbst enthält ein überwiegendes application.conf
im src/main/resources
.
Lib/Abhängigkeit ist auch mein code, btw.
import com.mylib.Finders
import com.myproj.sbt.Keys._
projKeyColorSetting in Compile := Finders.findColor //this calls ConfigFactory.load
seq(projSettings:_*)
Dem bauen gar nicht geladen, weil Sie nicht finden können, das erste conf key-ich versuche, die Referenz in meinem lib-code.
Habe ich versucht eine Reihe von Kombinationen von scoping-und Classpath-manipulation in meinem build-Datei, aber ohne Erfolg. Ich nahm an, dass die jar ' s reference.conf
gewesen wäre, auf die Compile
Bereich classpath, aber es funktioniert nicht so wie ich erwarten.
Verbrachte ich die Mehrheit der gestern brütete über SBT-Dokumentation auf Classpath, Bereiche, Tasten, Aufgaben und ResourceGenerators - meine Absicht ist, führen Sie eine benutzerdefinierte Plug-in, das sich auf die projKeyColorSetting
Einstellung in build.sbt
wie folgt:
lazy val projSettings = inConfig(Compile) {
Seq(
resourceGenerators in Compile <+= Def.task {
val fileCreated = createColorFile(projKeyColorSetting.value)
Seq(fileCreated)
}
)
}
Dank Havoc - ich habe versucht, übermäßig vereinfachen mein Beispiel, und aktualisiert Sie entsprechend mehr, wer mein build vorhanden ist. Ich bin mir nicht aufrufen-Projekt Anwendungs-code in build.sbt, aber code von einem meiner Abhängigkeit (die ich auch Steuern). Ich möchte Lesen, meine Projekt-Konfiguration unter src/main/resources, die allerdings nicht auf dem default-Classpath, als haben Sie mir bestätigt. Was ich wissen möchte ist: 1. Warum meine Abhängigkeit ist Referenz.conf nicht gefunden wird, und 2. Wie hinzufügen src/main/resources im Rahmen der mein-Einstellung der Tastenbelegung-oder plugin-vielen Dank für Ihre Antwort.
Lesen Sie auch die Reihenfolge, in der die Werte für die Konfiguration überschrieben werden: github.com/typesafehub/config#standard-behavior
InformationsquelleAutor bloo | 2014-03-26
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie immer Klasse aus foo.jar dann
ConfigFactory.load()
sollte ein Verweis.conf im selben jar. Wenn nicht, dann ist etwas falsch, aber es ist schwer zu erraten, was. Es könnte sein, dass Referenz.conf hat einige ungültige syntax in der es möglicherweise; könnte es sein, dass Referenz.conf nicht in das Glas; es könnte sein, dass Referenz.conf befindet sich in einem Unterverzeichnis statt root der jar; schwer zu erraten. Ich würde versuchen-Dconfig.trace=loads
zu suchen für Probleme, die in es (es sollte Ihnen sagen, ob die config zu laden versucht die Referenz.conf zum Beispiel). Sie können auch Ihre eigenenclassLoader.getResources
und finden Sie, wenn Sie die Datei ohne config beteiligt.Sie könnten auch versuchen
ConfigFactory.parseResourcesAnySyntax("reference")
und sehen, ob Ihre Referenz Einstellungen drin sind, und versuchen Sie den AufrufConfigFactory.load
direkt und sehen, ob Ihre Einstellungen dort sind. Nur im Allgemeinen, überprüfen Sie alle Annahmen und sehen, wo es schief geht.Als für how to add src/main/resources, die zwei grundlegende Strategien wäre 1), um es auf dem classpath irgendwie (das ist wohl schwierig in diesem Fall; Sie müssten es sogar vor, starten sbt oder hätte tun müssen, eine Art von benutzerdefinierten ClassLoader Spaß) oder vielleicht auch mehr praktischen 2) laden Sie es manuell mit
ConfigFactory.parseFile()
.Ich würde wahrscheinlich greifen die
resourceDirectory
Schlüssel einer Abhängigkeit, die Ihre Aufgabe tun, und dann etwas wie (ungetestet):Beachten Sie, dass dies erfordert eine änderung findColor zu nehmen
Config
parameter, oder vielleicht würden Sie lieber machen, Entfernungsmesser nicht-singleton, die konstruiert werden können, die mit einemConfig
; siehe das Beispiel bei https://github.com/typesafehub/config/blob/master/examples/scala/simple-lib/src/main/scala/simplelib/SimpleLib.scala#L22, wo ich versucht habe, zu verdeutlichen, dass bei Verwendung einesConfig
in der Regel eine Bibliothek, die beide standardmäßig aufConfigFactory.load
aber auch einen Konstruktor, der es erlaubt, benutzerdefinierteConfig
für Situationen wie diese.lazy val projSettings = inConfig(Kompilieren) { Seq( resourceGenerators in Kompilieren <+= Def.Aufgabe { // ändern Sie classpath fullClasspath in Kompilieren += Zurückgeführt.leer((resourceDirectory in Kompilieren).Wert) // task ausführen, und führen Sie die Abhängigkeit des code-val fileCreated = createColorFile(projKeyColorKey.Wert) Seq(fileCreated) } ) }
Mein problem hat sich schon eine Art perfekten Sturm Sie lernen, wie plugins, Projekt - /* build-Dateien, Aufgaben, Bereiche, etc arbeiten mit sbt. Ich war hardcoding resourceDirectory in Projekt/Plugin.scala war, dass Sie mir den falschen Ressource-Verzeichnis.. so jetzt bin ich verweisen auf das übergeordnete Projekt ist richtig. Ich bin immer noch versuchen, um es hinzuzufügen auf fullClasspath und ich bin immer noch zu kurz kommen auf der Suche nach den Anwendung.conf - Datei.
Denken Sie daran, dass für das Projekt foo classpath und deps sind in foo/*.sbt und foo/Projekt/*.scala. Das build selbst ist auch ein Projekt, damit das bauen für foo hat seine deps und classpath definiert foo/Projekt/*.sbt und foo/project/project/*.scala. Also die .sbt-Dateien foo/Projekt beziehen sich auf das build-Programm und die .scala-Dateien foo/Projekt beziehen sich auf die foo-Programm.
Und ja, es ist ein bauen, bauen und bauen, bauen, bauen es hält nur recursing, bis unsere Gehirne Schmelzen lassen.Typ "reload plugins" recurse ein bauen in die interaktive Eingabeaufforderung und "reload return" zu pop wieder heraus. Sie können dann mit "show fullClasspath" und Sachen zum überprüfen der build-Programm.
InformationsquelleAutor Havoc P
Ich denke es ist ein bug im sbt.
Hier ist mein Verständnis von Ihren Anwendungsfall und wie sbt letztlich benommen.
Projekt/bauen.Eigenschaften
Den Ordner config-only-Projekt ist für ein Projekt mit den folgenden zwei Dateien - bauen.sbt und src/main/resources/application.conf. Das simuliert eine externe Abhängigkeit für ein Projekt mit
application.conf
im inneren.bauen.sbt in
config-only-project
src/main/resources/application.conf in
config-only-project
Die folgenden Dateien konfigurieren Sie die Standard -
plugins
Projekt sowie die build-Konfiguration selbst (und somit das bauen für das Projekt unter Untersuchung).Projekt/bauen.sbt
Projekt/bauen.scala
Dieser gibt die folgende Verzeichnis-Struktur:
Was ich nicht verstehen konnte war, dass die Einstellung selbst hat nicht funktioniert - weder für das Projekt noch für die
plugins
Projekt.War der Fehler wie folgt:
Es hat funktioniert, wenn ich ausgeführt den gleichen code in der Scala-Konsole:
Wenn ich eingeschaltet, um die
plugins
Projekt und es klappt auch sehr gut:Ich wünschte, ich könnte es erklären, aber es scheint zu viel kognitive Last für mich 🙁
Das ist, was hat für die OP in der anderen Frage, und ich fragte ihn, um zu aktualisieren meine Antwort - stackoverflow.com/questions/22720360/... -(denke, ich werde es selbst tun in ein paar Tagen).
InformationsquelleAutor Jacek Laskowski
Gleiche Problem mit einem Spiel-Projekt, gelöst, indem ein
ClassLoader
parameterConfigFactory.parseResourcesAnySyntax()
in der task-definition:InformationsquelleAutor Stan