У меня есть полусложный процесс SBT, потому что мне нужно условно включить другой файл конфигурации в зависимости от того, какая сборка требуется. Я решил эту проблему с помощью подпроектов:
lazy val app = project
.in(file("."))
.enablePlugins(JavaAppPackaging)
.settings(
commonSettings // Seq() of settings to be shared between projects
,sourceGenerators in Compile += (avroScalaGenerateSpecific in Compile).taskValue
,(avroSpecificSourceDirectory in Compile) := new java.io.File("src/main/resources/com/coolCompany/folderName/avro")
)
lazy val localPackage = project
.in(file("build/local"))
.enablePlugins(JavaAppPackaging)
.settings(
organization := "com.coolCompany",
version := "0.1.0-SNAPSHOT",
scalaVersion := "2.11.8",
name := "my-neat-project",
scalacOptions := compilerOptions, //Seq() of compiler flags
sourceDirectory in Compile := (sourceDirectory in (app, Compile)).value,
mappings in Universal += {
((sourceDirectory in Compile).value / "../../conf/local/config.properties") -> "lib/config.properties"
}
)
.dependsOn(app)
val buildNumber = inputKey[String]("The version number of the artifact.")
lazy val deployedPackage = project
.in(file("build/deployed"))
.enablePlugins(JavaAppPackaging)
.settings(
organization := "com.coolCompany",
buildNumber := {
val args : Seq[String] = spaceDelimited("<arg>").parsed
println(s"Input version number is ${args.head}")
args.head
},
version := buildNumber.inputTaskValue + "-SNAPSHOT", //"0.1.0-SNAPSHOT",
scalaVersion := "2.11.8",
name := "my-cool-project",
scalacOptions := compilerOptions,
sourceDirectory in Compile := (sourceDirectory in (app, Compile)).value,
mappings in Universal += {
((sourceDirectory in Compile).value / "../../conf/deployed/config.properties") -> "lib/config.properties"
}
)
.dependsOn(app)
Теперь мне нужно разрешить передачу номера версии инструментом сборки при сборке. Вы можете видеть, что я уже пытался сделать: я создал inputKey
задачу с именем buildNumber
, а затем попытался получить доступ к ней в определении version :=
. Я могу отлично запустить саму задачу buildNumber
:
$ sbt 'deployedPackage/buildNumber 0.1.2'
Input version number is 0.1.2
Так что я могу по крайней мере убедиться, что моя задача ввода работает должным образом. Проблема в том, что я не могу понять, как я на самом деле получаю это входное значение при выполнении фактического packageBin
шага, который мне нужен.
Я пробовал следующее:
$ sbt 'deployedPackage/universal:packageBin 0.1.2'
[error] Expected key
[error] Expected '::'
[error] Expected end of input.
[error] deployedPackage/universal:packageBin 0.1.2
Так что он явно не понимает, что делать с номером версии. Я пробовал кучу различных вариантов ввода, таких как [...]packageBin buildNumber::0.1.2
, [...]packageBin -- buildNumber 0.1.2
или [...]packageBin -- 0.1.2
, и все они дают эту ошибку или что-то подобное, что указывает на то, что он не понимает, что я пытаюсь передать.
Теперь, в конечном счете, эти ошибки имеют смысл. buildNumber
, задача состоит в том, что знает, что делать со значениями командной строки, а packageBin
- нет. Как мне настроить эту задачу или этот набор задач, чтобы разрешить передачу номера версии?
Я видел этот вопрос, но ответы связаны с sbt плагин, который, кажется, делает примерно на 100 вещей больше, чем я хочу, в том числе довольно много, что мне нужно было бы найти способ явно отключить. Я только хочу, чтобы номер версии можно было передать и использовать в артефакте.
Изменить / обновить: я решил эту проблему, вернувшись к Maven.