我有一个这样的多项目设置:
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,我的项目配置似乎正确。
答案 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有更多了解的人可以提供关于此情况发生原因的更全面的解释,我将很乐意接受它作为正确的答案。