【问题标题】:Multiple target directories in sbt project buildsbt 项目构建中的多个目标目录
【发布时间】:2015-11-25 04:45:40
【问题描述】:

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

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

有了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

为什么会这样?有趣的是,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
)

【问题讨论】:

    标签: scala sbt


    【解决方案1】:

    SBT 中的每个项目都有一个target 目录。那就是它编译的类和其他生成的东西去的地方。

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

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

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

    当您在 SBT 控制台中运行 clean 时,它将清除当前项目目标目录中的文件。我不认为这意味着删除整个目录,但我可能错了。在任何情况下,在您选择了root 项目时运行clean 只会影响root 项目的target

    在 SBT 控制台中,您可以运行 reload pluginsreload return 以跳入和跳出(分别)当前项目的构建定义。在该上下文中调用clean 将清除它们各自的targets。

    至于将它们组合成一个易于删除的单一目录,我不确定我是否看到了其中的价值。使用 SBT 已经好几年了,各种target 目录从未真正成为阻碍。在过去一年左右的时间里,我什至不想删除目标目录。

    【讨论】:

    • 如果你真的想彻底清除所有生成的文件,那么,git clean 就是为了这个。
    猜你喜欢
    • 2015-09-25
    • 2016-08-07
    • 2018-05-25
    • 2020-09-17
    • 2021-05-28
    • 2011-10-22
    • 2016-06-03
    • 2013-11-02
    • 2014-03-17
    相关资源
    最近更新 更多