1. 类路径、源代码和资源

类路径、源代码和资源 

本页讨论 sbt 如何为不同的操作(如 compileruntest)构建类路径,以及如何覆盖或增强这些类路径。

基础 

在 sbt 中,类路径包含 Scala 库以及(当声明为依赖项时)Scala 编译器。与类路径相关的设置和任务通常提供类型为 Classpath 的值。这是 Seq[Attributed[File]] 的别名。 Attributed 是一种类型,它将一个异构映射与每个类路径条目相关联。目前,这允许 sbt 将编译产生的 Analysis 与相应的类路径条目相关联,并且对于托管条目,将定义依赖项的 ModuleIDArtifact 与之相关联。

要显式提取原始 Seq[File],请使用隐式添加到 Classpathfiles 方法

val cp: Classpath = ...
val raw: Seq[File] = cp.files

要从 Seq[File] 创建 Classpath,请使用 classpath,要从 File 创建 Attributed[File],请使用 Attributed.blank

val raw: Seq[File] = ...
val cp: Classpath = raw.classpath

val rawFile: File = ..
val af: Attributed[File] = Attributed.blank(rawFile)

非托管与托管 

类路径、源代码和资源分为两大类:非托管和托管。非托管文件是手动创建的文件,不受构建控制。它们是构建的输入。托管文件受构建控制。这些文件包括生成的源代码和资源,以及已解析和检索的依赖项以及已编译的类。

生成托管文件的任务应按如下方式插入

Compile / sourceGenerators +=
    generate( (Compile / sourceManaged).value / "some_directory")

在此示例中,generate 是类型为 File => Seq[File] 的某个函数,它实际执行工作。因此,我们将一个新任务追加到主源代码生成器列表(Compile / sourceGenerators)中。

要插入命名任务,这是插件的更好方法

val mySourceGenerator = taskKey[Seq[File]](...)

Compile / mySourceGenerator :=
  generate( (Compile / sourceManaged).value / "some_directory")

Compile / sourceGenerators += (Compile / mySourceGenerator)

task 方法用于引用实际任务,而不是任务的结果。

对于资源,有类似的键 resourceGeneratorsresourceManaged

按名称排除源代码文件 

项目基本目录默认情况下是一个源代码目录,除了 src/main/scala。你可以按名称排除源代码文件(下面示例中的 butler.scala),例如

unmanagedSources / excludeFilter := "butler.scala"

阅读有关 如何在项目文件夹中排除 .scala 源代码文件 - Google Groups 的更多信息

外部与内部 

类路径还分为内部和外部依赖项。内部依赖项是项目间依赖项。它们实际上将一个项目的输出放在另一个项目的类路径上。

外部类路径是非托管和托管类路径的并集。

 

对于类路径,相关的键是

  • unmanagedClasspath
  • managedClasspath
  • externalDependencyClasspath
  • internalDependencyClasspath

对于源代码

  • unmanagedSources 这些默认情况下是从 unmanagedSourceDirectories 构建的,它包含 scalaSourcejavaSource
  • managedSources 这些是生成的源代码。
  • sourcesmanagedSourcesunmanagedSources 合并在一起。
  • sourceGenerators 这些是生成源代码文件的任务。通常,这些任务会将源代码放在 sourceManaged 提供的目录中。

对于资源

  • unmanagedResources 这些默认情况下是从 unmanagedResourceDirectories 构建的,默认情况下是 resourceDirectory,它排除与 defaultExcludes 匹配的文件。
  • managedResources 默认情况下,对于标准项目,它为空。sbt 插件将在此处有一个生成的描述符文件。
  • resourceGenerators 这些是生成资源文件的任务。通常,这些任务会将资源放在 resourceManaged 提供的目录中。

使用 inspect 命令 获取更多详细信息。

另请参阅相关的 StackOverflow 答案

示例 

你有一个独立的项目,它使用一个库,该库在运行时从类路径加载 xxx.properties。你将 xxx.properties 放入目录“config”中。当你运行“sbt run”时,你希望该目录在类路径中。

Runtime / unmanagedClasspath += baseDirectory.value / "config"