我有一个多项目设置,如下所示:
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类,但该包如预期的那样位于类路径中。
然后,我可以将这些文件从kalosgen导入到kalosrpc中,intelliJ不会出现错误,并且可以完全访问这些文件中定义的类型信息。所以我运行kalosgen/compile,包就像我期望的那样生成了,但是当我继续使用kalosrpc/compile时,我得到了:
object gen is not a member of package com.kalos我尝试更改包的名称,但没有解决任何问题。根据presented here的信息,我的项目配置似乎是正确的。
发布于 2019-07-05 21:39:45
这里的问题是我是通过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-03 03:01:17
尝试从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。
https://stackoverflow.com/questions/56858438
复制相似问题