SBT: «объект не является членом пакета» при импорте зависимостей, созданных из другого проекта, через скользкий codegen - PullRequest
1 голос
/ 02 июля 2019

У меня есть несколько проектов настройки, как это:

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 во время компиляции, но этот пакет находится в classpath, как и ожидалось.

Затем я могу импортировать эти файлы из kalosgen в kalosrpc, intelliJ не жалуется и имеет полный доступ к информации о типах, определенной в этих файлах. Поэтому я запускаю kalosgen/compile, и пакеты генерируются так, как я ожидаю, однако, когда я получаю это с помощью kalosrpc/compile, я получаю:

object gen is not a member of package com.kalos

Я пытался изменить имя пакетов, но это ничего не исправило. На основании информации , представленной здесь конфигурация моего проекта кажется правильной.

Ответы [ 2 ]

1 голос
/ 02 июля 2019

Попробуйте выполнить 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

Также дважды проверьте, что сгенерированные файлы имеют пакет операторов вверху.

0 голосов
/ 05 июля 2019

Проблема заключалась в том, что я генерировал источники в Scala-коде с помощью утилиты slick-codegen:

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 сможет дать более полное объяснение того, почему это произошло, я с радостью приму это как правильный ответ.

...