如何在项目的Scala构建定义中定义包后面的目录结构?

时间:2014-05-28 07:16:09

标签: sbt

sbt项目中有两个完整的构建定义文件:Build.scalaHelpers.scala。它们位于project文件夹中。

我想将Helpers模块放入单独的子文件夹project/utils中。当我在import utils.HelpersBuild.scala时,它会说:

  

未找到:object utils

是否可以在sbt完整构建定义中定义包后面的目录结构?

2 个答案:

答案 0 :(得分:4)

您应该使用project/src/main/scala/utils代替project/utils

答案 1 :(得分:3)

Sbt构建是recursive,这意味着sbt构建定义是由sbt构建的,应用与普通项目相同的规则。

与Java不同,Scala在包和文件夹结构之间没有严格的关系。这意味着您可以将您的资源放在任何您喜欢的地方,并且它不必匹配包装声明。斯卡拉不会抱怨。

通过选中sourceDirectories设置密钥,Sbt知道在哪里搜索文件夹。

您可以通过执行show sourceDirectories轻松检查。但是,这将显示您实际项目的sourceDirectories。你如何检查它的构建?很容易,执行reload plugins,这会带你到你的构建。执行show sourceDirectories,它应该会向您显示它在/project/src/main/scalaproject/src/main/java和另外一个中查找来源,这些来源是受管理来源(对我们来说并不重要)。现在,您可以执行reload return返回主项目。

鉴于您应该能够创建一个对象,请在Helpers中命名为project/src/main/scala/utils/Helpers.scala

package utils

object Helpers {
  def printFancy(name: String) = println(s">>$name<<")
}

并在Build.scala

中使用它
import sbt._
import Keys._

import utils.Helpers._

object MyBuild extends Build {

  val printProjectName = taskKey[Unit]("Prints fancy project name")

  lazy val root = project.in(file(".")).settings(
    printProjectName := printFancy(name.value)
  )

}

您可以通过执行printProjectName来测试它。

> printProjectName
>>root<<
[success] Total time: 1 s, completed May 29, 2014 1:24:16 AM

我之前说过,sbt是递归的。这意味着,如果需要,可以使用相同的技术来配置sbt构建,就像用于配置自己项目的构建一样。

如果您不希望将文件保留在/project/src/main/scala下,但只是在/project/utils下,则可以通过在{{1}中创建build.sbt 来实现此目的文件夹,包含以下内容:

project

就像described in the documentation

一样

现在即使你将你的工具放在unmanagedSourceDirectories in Compile += baseDirectory.value / "utils" sbt也应该能够找到它。