本页讨论 sbt 如何为不同的操作(如 compile
、run
和 test
)构建类路径,以及如何覆盖或增强这些类路径。
在 sbt 中,类路径包含 Scala 库以及(当声明为依赖项时)Scala 编译器。与类路径相关的设置和任务通常提供类型为 Classpath
的值。这是 Seq[Attributed[File]]
的别名。 Attributed 是一种类型,它将一个异构映射与每个类路径条目相关联。目前,这允许 sbt 将编译产生的 Analysis
与相应的类路径条目相关联,并且对于托管条目,将定义依赖项的 ModuleID
和 Artifact
与之相关联。
要显式提取原始 Seq[File]
,请使用隐式添加到 Classpath
的 files
方法
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
方法用于引用实际任务,而不是任务的结果。
对于资源,有类似的键 resourceGenerators
和 resourceManaged
。
项目基本目录默认情况下是一个源代码目录,除了 src/main/scala
。你可以按名称排除源代码文件(下面示例中的 butler.scala
),例如
unmanagedSources / excludeFilter := "butler.scala"
阅读有关 如何在项目文件夹中排除 .scala 源代码文件 - Google Groups 的更多信息
类路径还分为内部和外部依赖项。内部依赖项是项目间依赖项。它们实际上将一个项目的输出放在另一个项目的类路径上。
外部类路径是非托管和托管类路径的并集。
对于类路径,相关的键是
unmanagedClasspath
managedClasspath
externalDependencyClasspath
internalDependencyClasspath
对于源代码
unmanagedSources
这些默认情况下是从 unmanagedSourceDirectories
构建的,它包含 scalaSource
和 javaSource
。managedSources
这些是生成的源代码。sources
将 managedSources
和 unmanagedSources
合并在一起。sourceGenerators
这些是生成源代码文件的任务。通常,这些任务会将源代码放在 sourceManaged
提供的目录中。对于资源
unmanagedResources
这些默认情况下是从 unmanagedResourceDirectories
构建的,默认情况下是 resourceDirectory
,它排除与 defaultExcludes
匹配的文件。managedResources
默认情况下,对于标准项目,它为空。sbt 插件将在此处有一个生成的描述符文件。resourceGenerators
这些是生成资源文件的任务。通常,这些任务会将资源放在 resourceManaged
提供的目录中。使用 inspect 命令 获取更多详细信息。
另请参阅相关的 StackOverflow 答案。
你有一个独立的项目,它使用一个库,该库在运行时从类路径加载 xxx.properties。你将 xxx.properties 放入目录“config”中。当你运行“sbt run”时,你希望该目录在类路径中。
Runtime / unmanagedClasspath += baseDirectory.value / "config"