Включить сгенерированные ресурсы в 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)
}
первая строка находит все созданные файлы с помощью искатели пути и вторая строка отображает их путь в целевой банке.