2013-03-08 2 views
10

Eines meiner Projekte wird ein jar-Paket bereitstellen, das für Unit-Tests in mehreren anderen Projekten verwendet werden soll. Bisher habe ich es geschafft, eine objects-commons_2.10-0.1-SNAPSHOT-test.jar sbt zu produzieren und sie in meinem Repository veröffentlichen zu lassen.Wie löse ich meine eigenen Testartefakte in SBT auf?

Allerdings kann ich keine Möglichkeit finden, sbt zu sagen, dieses Artefakt mit dem Testbereich in anderen Projekten zu verwenden.

Durch das Hinzufügen der folgenden Abhängigkeiten in meinem build.scala wird das Testartefakt nicht geladen.

"com.company" %% "objects-commons" % "0.1-SNAPSHOT", 
"com.company" %% "objects-commons" % "0.1-SNAPSHOT-test" % "test", 

Was ich brauche, ist die Standard-.jar-Datei als Kompilierung und Laufzeitabhängigkeit und die -test.jar als Abhängigkeit in meinem Testumfang zu verwenden. Aber irgendwie versucht sbt nie, das Testglas aufzulösen.

Antwort

14

Wie Test Artefakte

aktivieren verwenden, um das Test Artefakt Veröffentlichung, wenn der Haupt Artefakt veröffentlicht Sie Ihre build.sbt der Bibliothek hinzufügen müssen:

publishArtifact in (Test, packageBin) := true 

Ihre Artefakt veröffentlichen . Es sollte mindestens zwei JARs geben: objects-commons_2.10.jar und objects-commons_2.10-test.jar.

Um die Bibliothek zur Laufzeit und die Testbibliothek im Testumfang fügen Sie die folgenden Zeilen zu build.sbt der Hauptanwendung zu verwenden:

libraryDependencies ++= Seq("com.company" % "objects-commons_2.10" % "0.1-SNAPSHOT" 
    , "com.company" % "objects-commons_2.10" % "0.1-SNAPSHOT" % "test" classifier "tests" //for SBT 12: classifier test (not tests with s) 
) 

Der erste Eintrag lädt die die Laufzeitbibliotheken und die zweiten Kräfte Eintrag dass das Artefakt "Tests" nur im Testumfang verfügbar ist.

Ich habe ein Beispielprojekt:

git clone [email protected]:schleichardt/stackoverflow-answers.git --branch so15290881-how-do-i-resolve-my-own-test-artifacts-in-sbt 

Oder können Sie the example direkt in Github anzuzeigen.

+0

Dieser Ansatz kann transitive Abhängigkeiten des Test-Jar möglicherweise nicht auflösen.So ist es besser, die [offiziell empfohlene Methode, von der Dokumentation] zu verwenden (http://stackoverflow.com/a/8194192/495796), nachdem er die 'publishArtifact' Zeilen hinzufügen. Wenn es immer noch nicht funktioniert, sollte der Wechsel von Maven-Style zu Ivy-Style-Publishing (mit Ivy-Style-Repositories) funktionieren. –

-1

Es wird gut funktionieren, wenn Sie die name wie folgt ändern.

"com.company" %% "objects-commons" % "0.1-SNAPSHOT", 
"com.company" %% "objects-commons-test" % "0.1-SNAPSHOT" % "test", 
+0

Funktioniert nicht für mich. Das veröffentlichte Artefakt wird unter /com/company/objects-commons_2.10/0.1-SNAPSHOT/objects-commons_2.10 -0.1-SNAPSHOT-test.jar gespeichert, aber mit Ihrem Vorschlag erwartet es, das jar at/com/company/objects-commons-test_2.10/0.1-SNAPSHOT/objects-commons-test_2.10-0.1-SNAPSHOT.pom was nicht existiert. –

+0

Ich meinte, dass Sie den Namen möglichst von object-commons in object-commons-test ändern sollten. Sind diese Bibliotheken nicht unter Kontrolle Ihres Teams? Wenn ja, das ist schade ... –

+0

Dies ist Nonsense – lisak

1

Ihr Problem ist, dass sbt denkt, dass Ihre zwei Gläser das gleiche Artefakt sind, aber mit verschiedenen Versionen. Es dauert die "neueste", die 0,1-SNAPSHOT ist, und ignoriert den 0,1-SNAPSHOT-Test. Dies ist das gleiche Verhalten, das Sie sehen würden, wenn Sie zum Beispiel 0,1-SNAPSHOT und 0,2-SNAPSHOT haben.

Ich weiß nicht, was in diesen zwei Gläsern ist, aber wenn Sie beide auf dem Klassenpfad sein wollen, was Sie zu tun scheinen, dann müssen Sie den Namen des Tests ändern Artefakt zu Objekten-Commons-Test, wie Kazuhiro vorgeschlagen hat. Es scheint, dass dies für Sie einfach genug sein sollte, da Sie es bereits selbst in den Repo einbringen.