可以' sbt'完成' makefile' -like功能

时间:2018-03-30 22:04:16

标签: scala makefile sbt

我是一位新的scala / sbt用户,在撰写Makefiles方面拥有丰富的经验。在GNU make中,我可以写一个像:

这样的文件
c.txt: a.txt b.txt
       cat a.txt b.txt > $@

结果是,当我运行make时,如果c.txta.txt 较新,则会重新创建b.txt,而不是任何现有的c.txt$@是一个表示当前目标名称的助记符)。如果存在比c.txta.txt更新的b.txt,则不会执行任何操作。

我的项目中有一些构建步骤将来自非scala / java方法论,因此需要一些make-type依赖项。我的期望是那个' sbt'可以很容易地做到这一点,因为它是一个比40年更新的构建系统。但我在文档中没有看清楚这个案例。

有人可以提供一些例子吗?

1 个答案:

答案 0 :(得分:1)

这应该提供你所要求的东西。

这是一个简单的sbt项目,由两个文件组成,具有以下布局:

myproject/build.sbt
myproject/src/main/scala/org/foo/Hello.scala

构建文件包含:

name          := "hello"
version       := "0.01"
organization  := "org.foo"
scalaVersion  := "2.12.4"

scala源文件包含:

package org.foo

object Hello extends App {
  println("Hello")
}

在预定义的sbt任务中,"编译"。发出命令行" sbt compile"第一次导致在"目标"以下生成各种文件目录(大多数你通常不关心)。

其中包括:

./target/scala-2.12/classes/org/foo/Hello$.class
./target/scala-2.12/classes/org/foo/Hello$delayedInit$body.class
./target/scala-2.12/classes/org/foo/Hello.class

此示例中的编译任务操作与您从以下makefile获得的操作有些类似:

all: ./target/scala-2.12/classes/org/foo ./target/scala-2.12/classes/org/foo/Hello.class

./target/scala-2.12/classes/org/foo:
    mkdir -p ./target/scala-2.12/classes/org/foo

./target/scala-2.12/classes/org/foo/Hello.class:
    scalac -d ./target/scala-2.12/classes/org/foo src/main/scala/org/foo/Hello.scala

发出命令行" make all"会导致生成相同的三个文件:

./target/scala-2.12/classes/org/foo/Hello$.class
./target/scala-2.12/classes/org/foo/Hello$delayedInit$body.class
./target/scala-2.12/classes/org/foo/Hello.class

在任何一种情况下,您都可以使用以下命令行调用Hello类中的main方法:

$ scala -cp target/scala-2.12/classes org.foo.Hello
Hello

" sbt compile"任务还会在目标目录下生成35个其他文件,此外它还会在"项目"下生成58个文件。目录,所以比较简单。

您可以使用以下命令行列出预定义任务:

sbt tasks

在我的系统(sbt 1.1.2)上,这将打印一个包含32个条目的列表,并附有说明。

如果不是"编译"任务我们发布了"包"任务,它会自动触发"编译"任务("包"依赖"编译"默认情况下),另外还会生成一个包含生成的.class文件的jar文件:

$ jar -tf target/scala-2.12/hello_2.12-0.01.jar
META-INF/MANIFEST.MF
org/
org/foo/
org/foo/Hello$.class
org/foo/Hello$delayedInit$body.class
org/foo/Hello.class

通常,构建定义以比同等makefile更少的详细程度完成更多,特别是如果您的项目依赖于默认假设。