объект не является членом пакета при импорте зависимости, созданной из другого проекта через гладкий codegen

У меня есть многопроектная настройка, подобная этой:

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

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


person Robbie Milejczak    schedule 02.07.2019    source источник
comment
Имеются ли в сгенерированных файлах операторы package somename вверху?   -  person Mario Galic    schedule 02.07.2019
comment
да, у них есть имена пакетов, которые я ожидаю от них. Я попытался настроить проект kalosgen для вывода его кода в каталог src_managed из kalosmodel (вместо собственного каталога src_managed), и он все еще не работает.   -  person Robbie Milejczak    schedule 02.07.2019
comment
Можно ли опубликовать минимальный пример в онлайн-репозитории?   -  person Mario Galic    schedule 02.07.2019
comment
Я переделал минимальный пример, но он работает: \ должно быть что-то не так с моим исходным проектом, но при сравнении двух я не могу понять это   -  person Robbie Milejczak    schedule 02.07.2019


Ответы (2)


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

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

person Mario Galic    schedule 02.07.2019
comment
это была опечатка с моей стороны, это /target/scala-2.13/src_managed/main - person Robbie Milejczak; 02.07.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, может предоставить более полное объяснение того, почему это произошло, я с радостью приму это как правильный ответ.

person Robbie Milejczak    schedule 05.07.2019