SBT: "объект не является членом пакета" при импорте зависимостей, созданных из другого проекта с помощью скользкого кода

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

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 в kalosrpcIntelliJ не жалуется и имеет полный доступ к информации о типах, определенной в этих файлах. Итак, я бегу kalosgen/compile и пакеты генерируются, как я ожидаю, однако, когда я следую за этим с kalosrpc/compile Я получил:

object gen is not a member of package com.kalos

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

2 ответа

Решение

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

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

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

Другие вопросы по тегам