【问题标题】:Why does my sourceDirectories setting have no effect in sbt?为什么我的 sourceDirectories 设置在 sbt 中无效?
【发布时间】:2014-12-03 17:26:58
【问题描述】:

我正在阅读 SBT Getting Started 指南。该页面以sourceDirectories 设置为例。为了自己尝试,我将以下内容放入我的 build.sbt 文件中,用于基本的“hello world”项目。

sourceDirectories in Compile := Seq(file("other"))

(附加+=++= 也不起作用。)

我在<base-dir>/other<base-dir>/src/main/scala 中有源文件。我跑了sbt 并输入了compile。它忽略了设置:

> compile
[info] Compiling 1 Scala source to /Learning/Scala/proj1/target/scala-2.9.2/classes...
[error] /Learning/Scala/proj1/src/main/scala/hello.scala:7: not found: value Foo
[error]     println(Foo.foo)

Foo 对象在 other 源目录的 foo.scala 中定义。

我错过了什么?

【问题讨论】:

    标签: sbt


    【解决方案1】:

    tl;dr The answer by @schleichardt 是有效的 - 您需要将以下内容添加到 build.sbt 文件中:

    unmanagedSourceDirectories in Compile += file("other")
    

    解释归结为检查compile 任务的依赖关系。使用inspect tree compile 找出它们。

    [proj1]> inspect tree compile
    [info] compile:compile = Task[sbt.inc.Analysis]
    [info]   +-compile:compile::compileInputs = Task[sbt.Compiler$Inputs]
    [info]   | +-compile:scalacOptions = Task[scala.collection.Seq[java.lang.String]]
    [info]   | +-compile:sources = Task[scala.collection.Seq[java.io.File]]
    [info]   | +-*/*:sourcePositionMappers = Task[scala.collection.Seq[scala.Function1[xsbti.Position, scala.Option[xsbti.Position]]]]
    [info]   | +-*/*:maxErrors = 100
    [info]   | +-*:compilers = Task[sbt.Compiler$Compilers]
    [info]   | +-compile:compile::streams = Task[sbt.std.TaskStreams[sbt.Init$ScopedKey[_ <: Any]]]
    [info]   | | +-*/*:streamsManager = Task[sbt.std.Streams[sbt.Init$ScopedKey[_ <: Any]]]
    [info]   | |
    [info]   | +-compile:incCompileSetup = Task[sbt.Compiler$IncSetup]
    [info]   | +-*/*:compileOrder = Mixed
    [info]   | +-compile:dependencyClasspath = Task[scala.collection.Seq[sbt.Attributed[java.io.File]]]
    [info]   | +-compile:classDirectory = target/scala-2.10/classes
    [info]   | +-*/*:javacOptions = Task[scala.collection.Seq[java.lang.String]]
    [info]   |
    [info]   +-compile:compile::streams = Task[sbt.std.TaskStreams[sbt.Init$ScopedKey[_ <: Any]]]
    [info]     +-*/*:streamsManager = Task[sbt.std.Streams[sbt.Init$ScopedKey[_ <: Any]]]
    [info]
    

    如您所见,该任务依赖于compile:sources 任务。该任务又依赖于使用compile:unmanagedSourceDirectories 设置的compile:unmanagedSources 任务。

    [proj1]> inspect tree compile:sources
    [info] compile:sources = Task[scala.collection.Seq[java.io.File]]
    [info]   +-compile:unmanagedSources = Task[scala.collection.Seq[java.io.File]]
    [info]   | +-compile:unmanagedSourceDirectories = List(/Users/jacek/sandbox/stackoverflow/proj1/src/main/scala, /Users/jacek/sandbox/stackoverflow/proj1/src/main/java, /Users/..
    [info]   | | +-compile:javaSource = src/main/java
    [info]   | | | +-compile:sourceDirectory = src/main
    [info]   | | |   +-*:sourceDirectory = src
    [info]   | | |   | +-*:baseDirectory = /Users/jacek/sandbox/stackoverflow/proj1
    [info]   | | |   |   +-*:thisProject = Project(id: proj1, base: /Users/jacek/sandbox/stackoverflow/proj1, aggregate: List(), dependencies: List(), configurations: List(compile..
    [info]   | | |   |
    [info]   | | |   +-compile:configuration = compile
    [info]   | | |
    [info]   | | +-compile:scalaSource = src/main/scala
    [info]   | | | +-compile:sourceDirectory = src/main
    [info]   | | |   +-*:sourceDirectory = src
    [info]   | | |   | +-*:baseDirectory = /Users/jacek/sandbox/stackoverflow/proj1
    [info]   | | |   |   +-*:thisProject = Project(id: proj1, base: /Users/jacek/sandbox/stackoverflow/proj1, aggregate: List(), dependencies: List(), configurations: List(compile..
    [info]   | | |   |
    [info]   | | |   +-compile:configuration = compile
    [info]   | | |
    [info]   | | +-*:baseDirectory = /Users/jacek/sandbox/stackoverflow/proj1
    [info]   | |   +-*:thisProject = Project(id: proj1, base: /Users/jacek/sandbox/stackoverflow/proj1, aggregate: List(), dependencies: List(), configurations: List(compile, runt..
    [info]   | |
    [info]   | +-*/*:excludeFilter = sbt.SimpleFileFilter@7ced8ea7
    [info]   | +-*:baseDirectory = /Users/jacek/sandbox/stackoverflow/proj1
    [info]   | +-*/*:unmanagedSources::includeFilter = sbt.SimpleFilter@1beb6bba
    [info]   | +-*/*:sourcesInBase = true
    [info]   |
    [info]   +-compile:managedSources = Task[scala.collection.Seq[java.io.File]]
    [info]     +-compile:sourceGenerators = List()
    [info]
    

    compile:unmanagedSourceDirectories 设置引用“非托管源目录,其中包含手动创建的源。”

    [proj1]> inspect compile:unmanagedSourceDirectories
    [info] Setting: scala.collection.Seq[java.io.File] = List(/Users/jacek/sandbox/stackoverflow/proj1/src/main/scala, /Users/jacek/sandbox/stackoverflow/proj1/src/main/java, /Users/jacek/sandbox/stackoverflow/proj1/other)
    [info] Description:
    [info]  Unmanaged source directories, which contain manually created sources.
    [info] Provided by:
    [info]  {file:/Users/jacek/sandbox/stackoverflow/proj1/}proj1/compile:unmanagedSourceDirectories
    [info] Defined at:
    [info]  (sbt.Defaults) Defaults.scala:161
    [info]  /Users/jacek/sandbox/stackoverflow/proj1/build.sbt:1
    [info] Dependencies:
    [info]  compile:javaSource
    [info]  compile:scalaSource
    [info]  *:baseDirectory
    [info] Reverse dependencies:
    [info]  compile:unmanagedSources
    [info]  compile:sourceDirectories
    [info] Delegates:
    [info]  compile:unmanagedSourceDirectories
    [info]  *:unmanagedSourceDirectories
    [info]  {.}/compile:unmanagedSourceDirectories
    [info]  {.}/*:unmanagedSourceDirectories
    [info]  */compile:unmanagedSourceDirectories
    [info]  */*:unmanagedSourceDirectories
    [info] Related:
    [info]  test:unmanagedSourceDirectories
    

    该设置是scala.collection.Seq[java.io.File] 类型,并且要将元素附加到seq,您可以使用+= 方法。

    话虽如此,build.sbt 文件应该如下:

    unmanagedSourceDirectories in Compile += (baseDirectory / "other").value
    

    您不必使用baseDirectory 设置,但它使基本目录明确。

    【讨论】:

    • 感谢您的详尽回答。我认为它会帮助其他人。就我而言,我已经放弃了 SBT,我希望永远不会回来。
    • 哦,加油@RobN,sbt 太难了,所以你必须把它写在你的简历上,才能在面试时在其他“普通”开发人员中大放异彩 :-) 说真的,sbt 与make, ant, maven, gradle, buildr 值得花时间去学习。您使用什么构建工具?
    • @Jacek Laskowski...我曾经在 pyspark 上工作,特别是在 Scala 和 SBT 方面遇到了很多困难。您能否就以下问题提出您宝贵的建议。 stackoverflow.com/questions/63084177/…谢谢
    【解决方案2】:

    你可以试试这个:

    unmanagedSourceDirectories in Compile += file("other")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-01-29
      • 2014-10-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-19
      相关资源
      最近更新 更多