sbt项目构建中的多个目标目录

pro*_*eek 6 scala sbt

我在这个结构中有一个sbt项目:

.
??? build.sbt
??? project
?   ??? build.properties
?   ??? plugins.sbt
??? src
    ??? main
    ?   ??? java
    ?       ??? smcho
    ?           ??? App.java
    ??? test
        ??? java
            ??? smcho
                ??? AppTest.java
Run Code Online (Sandbox Code Playgroud)

有了sbt package,我有三个目标目录,target2和target3有相似的结构.

.
??? 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
Run Code Online (Sandbox Code Playgroud)

为什么这样?有趣的是,sbt clean不删除目标目录,有没有办法有一个简单的目标,以便我可以轻松删除它们?

这是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
)
Run Code Online (Sandbox Code Playgroud)

Dyl*_*lan 15

SBT中的每个项目都有一个target目录.这就是它编译的类和其他生成的东西.

root是一个项目,TARGET 3在您的图表中是它的目标.

您的构建定义(project目录)也是一个项目.使用SBT,可以编写scala代码来实现与构建相关的任务和设置.编译代码必须去某个地方.它位于您标记为TARGET 2- 的目录中project/target.

SBT中的构建定义可以是递归的,即构建定义可以有自己的构建定义.由于您使用的是插件(在中定义project/plugins.sbt),因此您的构建定义需要一个构建定义,最终会在您的图表中编译为project/project/targetaka TARGET 1.

当您clean在SBT控制台中运行时,它将从当前项目的目标目录中清除文件.我不认为这是删除整个目录,但我可能错了.无论如何,cleanroot选择项目时运行应仅影响root项目target.

在SBT控制台中,您可以运行reload pluginsreload return跳转(分别)跳转到当前项目的构建定义.clean在这种情况下打电话会清理他们各自target的.

至于将它们组合成一个易于删除的单一目录,我不确定我是否看到了它的价值.现在已经使用SBT几年了,各种target目录从来没有真正阻碍过.我不认为我甚至想在去年左右一次删除目标目录.

  • 如果你真的想要彻底清除所有生成的文件,那么,这就是`git clean`的用途. (3认同)