2015-11-24 15 views
5

Ich habe ein SBT-Projekt in dieser Struktur:Mehrere Zielverzeichnisse in sbt Projekt bauen

. 
├── build.sbt 
├── project 
│   ├── build.properties 
│   └── plugins.sbt 
└── src 
    ├── main 
    │   └── java 
    │    └── smcho 
    │     └── App.java 
    └── test 
     └── java 
      └── smcho 
       └── AppTest.java 

Mit sbt package, ich habe drei Zielverzeichnisse und target2 und ziel3 haben eine ähnliche Struktur.

. 
├── build.sbt 
├── project 
│   ├── build.properties 
│   ├── plugins.sbt 
│   ├── project 
│   │   └── target <---------- TARGET 1 
│   └── target  <---------- TARGET 2 
│    ├── config-classes 
│    ├── resolution-cache 
│    ├── scala-2.10 
│    └── streams 
├── src 
│   ├── main 
│   │   └── java 
│   └── test 
│    └── java 
└── target <--------------- TARGET 3 
    ├── resolution-cache 
    │   ├── com.example 
    │   └── reports 
    ├── scala-2.11 
    │   ├── classes 
    │   └── hello_2.11-0.1.0.jar 
    └── streams 
     ├── $global 
     └── compile 

Warum so? Interessanterweise entfernt sbt clean die Zielverzeichnisse nicht, gibt es eine Möglichkeit, ein einfaches Ziel zu haben, damit ich sie leicht entfernen kann?

Dies wird build.sbt:

lazy val hello = taskKey[Unit]("An example task") 
val junit = "junit" % "junit" % "4.11" % "test" 

lazy val commonSettings = Seq( 
    organization := "com.example", 
    version := "0.1.0", 
    scalaVersion := "2.11.4" 
) 

lazy val root = (project in file(".")). 
    settings(
     commonSettings: _* 
). 
    settings(
     hello := { println("Hello!") }, 
     name := "hello", 
     libraryDependencies += junit 
) 

Antwort

12

Jedes Projekt in SBT hat ein target Verzeichnis. Das ist, wo seine kompilierten Klassen und andere generierte Dinge gehen.

Ihre root ist ein Projekt, und TARGET 3 in Ihrem Diagramm ist das Ziel.

Ihre Build-Definition (das Verzeichnis project) ist auch ein Projekt. Mit SBT ist es möglich, Scala-Code zu schreiben, um Build-bezogene Aufgaben und Einstellungen zu implementieren. Dieser kompilierte Code muss irgendwohin gehen. Es geht in das Verzeichnis, das Sie als TARGET 2 - project/target gekennzeichnet haben.

Builddefinitionen in SBT können rekursiv sein, d. H. Ihre Builddefinition kann eine eigene Builddefinition haben. Da Sie Plugins verwenden (definiert in), benötigt Ihre Builddefinition eine Builddefinition, die in Ihrem Diagramm zu project/project/target aka TARGET 1 kompiliert wird.

Wenn Sie in der SBT-Konsole clean ausführen, bereinigt es Dateien aus dem Zielverzeichnis des aktuellen Projekts. Ich denke nicht, dass es das gesamte Verzeichnis löschen soll, aber ich könnte mich da irren. In jedem Fall sollte die Ausführung von clean, während Sie das Projekt root ausgewählt haben, nur das root Projekt target betreffen.

In der SBT-Konsole können Sie reload plugins oder reload return ausführen, um in die aktuelle Builddefinition des aktuellen Projekts zu springen bzw. daraus zu springen. Rufen clean in diesem Zusammenhang würde ihre jeweiligen target s reinigen.

Wie für die Kombination von ihnen in einem einzigen, leicht zu entfernen Verzeichnis, ich bin mir nicht sicher, ich sehe den Wert darin. SBT seit mehreren Jahren verwendet, die verschiedenen target Dirs waren nie wirklich in die Quere kommen. Ich glaube nicht, dass ich das Zielverzeichnis ein einziges Mal im letzten Jahr löschen wollte.

+2

Und wenn Sie wirklich alle generierten Dateien überall löschen wollen, dann ist 'git clean' genau dafür da. –

Verwandte Themen