1

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

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。它还在编译时将 protobufs 编译为 scala 类,但该包按预期位于类路径中。

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

object gen is not a member of package com.kalos

我试过更改包的名称,但它没有解决任何问题。根据此处提供的信息,我的项目配置似乎正确。

4

2 回答 2

1

尝试show sourceManaged从 sbt 执行,它应该输出生成文件应该结束的位置,例如在我的项目中它位于

.../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

还要仔细检查生成的文件顶部是否有包语句。

于 2019-07-02T19:01:16.827 回答
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 有更多了解的人可以提供更全面的解释为什么会发生这种情况,我会很乐意接受它作为正确的答案。

于 2019-07-05T13:39:44.973 回答