SBT:通过平滑代码导入从另一个项目构建的依赖项时,“对象不是包的成员”

时间:2019-07-02 18:43:42

标签: scala sbt slick slick-codegen

我有一个这样的多项目设置:

lazy val kalosrpc = project
  .settings(
    libraryDependencies ++= Seq(
      "io.grpc" % "grpc-netty" % scalapb.compiler.Version.grpcJavaVersion
    )
  ).dependsOn(kalosgen)

lazy val kalosgen = project
  .settings(
    // settings not important
  )

kalosgen的主类通过slick-codegen生成一个模型,并将其放置在:

kalosgen/target/scala-2.13/src_managed/main 
com.kalos.gen中的

。它还可以在编译时将protobuf编译为scala类,但是该包如预期的那样在类路径中。

然后我可以将这些文件从kalosgen导入到kalosrpc中,intelliJ不会抱怨,并且可以完全访问那些文件中定义的类型信息。因此,我运行kalosgen/compile并按预期生成了程序包,但是当我继续使用kalosrpc/compile时,我得到:

object gen is not a member of package com.kalos

我尝试过更改软件包的名称,但是它不能解决任何问题。根据信息presented here,我的项目配置似乎正确。

2 个答案:

答案 0 :(得分:1)

尝试从sbt执行show sourceManaged,它应该输出generated files应该终止的位置,例如在我的项目中,

.../myproject/target/scala-2.13/src_managed

可能应该是

kalosgen/target/scala-2.13/src_managed/main/com/kalos/gen

代替

kalosgen/target/scala-2.13/main/com/kalos/gen

还要仔细检查生成的文件,在顶部具有软件包statements

答案 1 :(得分:0)

这里的问题是我正在通过slick-codegen实用程序以scala代码生成源代码:

import slick.codegen.SourceCodeGenerator

object Main extends App {
  val url = "hidden"
  val user = "hidden"
  val password = "hidden"
  val dbDriver = "com.mysql.jdbc.Driver"
  val profile = "slick.jdbc.MySQLProfile"
  SourceCodeGenerator.main(
    Array(
      profile,
      dbDriver,
      url,
      "./kalosgen/target/scala-2.13/src_managed/main",
      "com.kalos.gen",
      user,
      password
    )
  )
}

我的猜测是,您必须通过SBT任务生成源,以使它们被SBT识别为有效源(至少出于项目间依赖关系的目的),因此我能够将上述代码转换为一个任务在build.sbt的编译时运行:

lazy val gen = project
  .settings(
    libraryDependencies ++= Seq(
      "dependencies"
    ),
    sourceGenerators in Compile += Def.task {
      val outDir = (sourceManaged in Compile).value.getPath
      (runner in Compile).value.run(
        "slick.codegen.SourceCodeGenerator",
        (dependencyClasspath in Compile).value.files,
        Array(
          "slick.jdbc.MySQLProfile",
          "com.mysql.jdbc.Driver",
          "url",
          outDir,
          "com.kalos.gen",
          "username",
          "password"
        ),
        streams.value.log
      )
      Seq(file(outDir + "/com/kalos/gen/Tables.scala"))
    }.taskValue
  )

现在,生成的Tables.scala将按预期出现在类路径中,并且我的项目将进行编译。如果对sbt有更多了解的人可以提供关于此情况发生原因的更全面的解释,我将很乐意接受它作为正确的答案。