Я использую https://github.com/sbt/sbt-git, чтобы воспользоваться преимуществами автоматического управления версиями, как описано в разделе Управление версиями с помощью Git.
Мой файл build.sbt
выглядит следующим образом:
version := "0.1.0"
scalaVersion := "2.12.8"
scalacOptions ++= Seq(
"-encoding", "UTF-8", // source files are in UTF-8
"-deprecation", // warn about use of deprecated APIs
"-unchecked", // warn about unchecked type parameters
"-feature", // warn about misused language features
"-language:higherKinds", // allow higher kinded types without `import scala.language.higherKinds`
"-Xlint", // enable handy linter warnings
"-Xfatal-warnings", // turn compiler warnings into errors
"-Ypartial-unification" // allow the compiler to unify type constructors of different arities
)
scalacOptions in(Compile, console) ~= {
_.filterNot(Set("-Xlint"))
}
libraryDependencies ++= Seq(
"org.typelevel" %% "cats-core" % "1.6.0",
"ch.qos.logback" % "logback-classic" % "1.2.3",
"com.typesafe.scala-logging" %% "scala-logging" % "3.9.2"
)
libraryDependencies ++= Seq(
"org.scalacheck" %% "scalacheck" % "1.14.0" % "test",
"org.scalactic" %% "scalactic" % "3.0.6" % "test",
"org.scalatest" %% "scalatest" % "3.0.6" % "test"
)
libraryDependencies ++= Seq(
"com.typesafe.akka" %% "akka-slf4j" % "2.5.22",
"ch.qos.logback" % "logback-classic" % "1.2.3"
)
libraryDependencies += "com.dimafeng" %% "testcontainers-scala" % "0.25.0" % "test"
enablePlugins(JavaServerAppPackaging)
enablePlugins(DockerPlugin)
enablePlugins(GitVersioning)
dockerExposedPorts := Seq(8080)
git.formattedShaVersion := git.gitHeadCommit.value map { sha =>
s"$sha".substring(0, 7)
}
dockerUpdateLatest := true
dockerAlias := DockerAlias(None, Some("zerocoder"), (packageName in Docker).value, git.gitDescribedVersion.value)
После фиксации он не увеличивается автоматически с версии «0.1.0» до «0.2.0».
Что я делаю неправильно?
Краткий ответ:
build.sbt
файла (т.е. этого оператора version := "0.1.0"
)>git tag -a v0.2.0 -m "my version 0.2.0"
Затем вы можете увидеть версию, установленную плагином, запустив:
>sbt version
// Displays
// [info] 0.2.0
Вот небольшое объяснение:
Итак, принцип работы sbt-git
заключается в том, что он устанавливает для вас версию вашей сборки sbt (та, которую вы получаете в результате запуска sbt version
). Для этого следует несколько правила, вот первые 2:
- Looks at version-property setting (default to project.version), and checks the sys.props to see if this has a value. If so, use it.
- Otherwise, looks at the project tags. The first to match the gitTagToVersionNumberSetting is used to assign the version. The default is to look for tags that begin with v and a number, and use the number as the version. If there are multiple version tags, it will pick the highest.
Итак, в вашем случае, поскольку вы явно установили project version
на 0.1.0
в своем build.sbt
, в результате запуска sbt version
вы получите 0.1.0
. Даже после выполнения некоторых коммитов значение sbt version
все равно будет 0.1.0
, потому что будут применяться правила (если версия установлена в вашем build.sbt
). Обратите внимание, что плагин не изменяет значение, установленное в этом файле., он использует его только тогда, когда он определен.
Если бы вы использовали удалить эту строку (version := "0.1.0"
), тогда применялось бы правило 2, которое в двух словах ищет tag
и возвращает первое соответствие gitTagToVersionNumberSetting
, которое по умолчанию представляет собой строку, начинающуюся с v
и за которой следует число.
Таким образом, чтобы установить для вашего проекта версию 0.2.0
с помощью плагина, вам нужно будет создать тег поверх головного коммита v0.2.0
(например, работающий git tag -a v0.2.0 -m "my version 0.2.0"
).
И по мере разработки вашего проекта будет добавлено несколько коммитов, ведущих к вашей версии 0.3.0
(или 0.2.1
), и как только вы создадите соответствующий тег поверх последнего коммита — скажем, тег v0.3.0
— тогда plugin
выберет его. up (применив правило 2) и используйте его, чтобы установить его как версию вашего проекта (которую вы могли увидеть, запустив sbt version
, как было сказано ранее).
Это поток, который вы бы использовали в основном для того, чтобы ваша версия проекта следовала за вашей (git) tags
версией.
Я правильно понимаю, когда я его коммичу, то он автоматически посчитает версию?
Я имею в виду, например, текущий тег v0.2.0
. Затем я вношу некоторые изменения в код, фиксирую его, после чего я ожидаю, что тег автоматически увеличится до 0.3.0
.
@zero_coding, в основном вам нужно создать тег поверх вашего коммита, и плагин будет использовать его для установки версии вашего проекта.
Отличный материал :)!
Итак, идея здесь в том, что вместо того, чтобы плагин обновлял версию, указанную в вашем
build.sbt
, там вообще не указана версия. Вместо этого плагин вычисляет версию (на лету, в начале каждой сборки), просматривая ваш статус git.