我是一位新的scala / sbt用户,在撰写Makefiles方面拥有丰富的经验。在GNU make中,我可以写一个像:
这样的文件c.txt: a.txt b.txt
cat a.txt b.txt > $@
结果是,当我运行make时,如果c.txt
或a.txt
较新,则会重新创建b.txt
,而不是任何现有的c.txt
($@
是一个表示当前目标名称的助记符)。如果存在比c.txt
和a.txt
更新的b.txt
,则不会执行任何操作。
我的项目中有一些构建步骤将来自非scala / java方法论,因此需要一些make-type依赖项。我的期望是那个' sbt'可以很容易地做到这一点,因为它是一个比40年更新的构建系统。但我在文档中没有看清楚这个案例。
有人可以提供一些例子吗?
答案 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更少的详细程度完成更多,特别是如果您的项目依赖于默认假设。