在src_managed文件夹中找不到对象

时间:2019-01-02 12:01:30

标签: scala sbt

(我认为)这是与Type not found: type .. when type is in src_managed folder不同的问题。

我是从1.1.1的sbt构建的,我已经在sbt中设置了一个代码生成任务,该任务可以按预期运行,并创建了许多具有相同结构的文件。

package com.a3.traffic
package object Vendor

它们被导入为以下其他文件:

import com.a3.traffic.Vendor._

文件在src_managed下生成。我尝试了两种不同的设置

src_managed / main / Vendor

src_managed / main / scala / com / a3 / traffic / Vendor

在两种情况下,我都会遇到以下错误:

[error] /Users/luis/IdeaProjects/SparkTrafficAllocation/core/src/main/scala/com/a3/traffic/Params.scala:5:28: object Vendor is not a member of package com.a3.traffic
[error] import com.a3.traffic.Vendor._      

我可以通过将已生成的代码移至src / main / scala / com / a3 / traffic / Vendor(与我的代码其余部分一起使用)来解决此问题,但是我明白了。

[error] /Users/luis/IdeaProjects/SparkTrafficAllocation/core/target/scala-2.11/src_managed/main/scala/com/a3/traffic /Vendor/Vendor.scala:3:16: package is already defined as package object Vendor
[error] package object Vendor {

我觉得这很令人困惑。从我的代码中看不到src_managed中定义的对象,但可以看到该包中的内容。如何使src_managed中的对象可用于该包的其余部分?

编辑 我创建了一个最小项目来显示此https://github.com/sisamon/MinimalApp

编辑2 我正在使用名称/ package.scala / package.scala =>对象名称作为原始名称。scalacase类/ case对象不起作用。

1 个答案:

答案 0 :(得分:2)

问题出在here

def generator (x: Country) = {
  generateADT("Vendor", x.vendor)
  generateADT("InstallationType", x.installationType)
}

请记住,您的任务必须返回一个<{>> 生成的Seq ALL Files。 / p>

而且,您的generateADT每个都返回一个Seq中的File,因此,您只返回了上次呼叫(其中在这种情况下是Seq,这就是为什么找不到您的InstallationType的原因!

您可以通过注释第二行来进行检查,这将使第一行返回,在这种情况下将找到Vendor

有几种方法可以解决此问题,最简单,最优雅的(IMHO)是这样的:

Vendor

PS:作为建议,您应该显式放置所有函数/方法的返回类型。不仅可以帮助进行其他类型的类型推断,还可以避免几个编译错误并提高代码的可读性。