Включить сгенерированные ресурсы в jar (SBT)

я писал плагин SBT, который генерирует ресурсы в resource_managed. Теперь я хочу включить эти сгенерированные ресурсы в сгенерированную банку в качестве детали SBT docs:

генерировать ресурсы:

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

Я читал документы, но честно говоря, как это сделать Не могу понять. Может ли кто-нибудь объяснить это или указать мне на другой проект, который делает это, чтобы я мог видеть, как они это делают?

1 ответов


сначала просто уточнить, они включены в банки, содержащие скомпилированные классы. Они не включены в банки, содержащие источники.

по умолчанию созданные ресурсы не включаются в пакет исходный артефакт.

на packageBin сгенерированные файлы уже должны быть включены-просто убедитесь, что вы возвращаете все сгенерированные файлы из метода генератора. Предполагая, что вы хотите упаковать их в артефакт sources, это что ты должен сделать.

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

lazy val generatePropertiesTask = Def.task {
  val file = (resourceManaged in Compile).value / "stack-overflow" / "res.properties"
  val contents = s"name=${name.value}\nversion=${version.value}"
  IO.write(file, contents)
  Seq(file)
}

resourceGenerators in Compile += generatePropertiesTask.taskValue

чтобы включить это в сгенерированные источники, вы должны сказать sbt, где res.properties необходимо скопировать в созданный артефакт источников. Задача, которая генерирует упакованные источники, называется packageSrc, поэтому вы должны установить отображений scoped к этой задаче.

mappings in (Compile, packageSrc) += {
   ((resourceManaged in Compile).value / "stack-overflow" / "res.properties") -> "path/in/jar/res.properties"
}

потому что ваш генератор может генерировать много задач, и отображение каждого вручную было бы утомительной задачей, sbt дает вам утилиты для отображения нескольких путей одновременно.

mappings in (Compile, packageSrc) ++= {
  val allGeneratedFiles = ((resourceManaged in Compile).value ** "*") filter { _.isFile }
  allGeneratedFiles.get pair relativeTo((resourceManaged in Compile).value)
}

первая строка находит все созданные файлы с помощью искатели пути и вторая строка отображает их путь в целевой банке.