如何在命令行中从build.sbt中提取数据

wid*_*get 5 scala sbt

我想以某种方式获取数据versionpackageName in Docker例如。我需要CI标记docker映像以供将来使用。所以有可能获得像maven这样的值mvn --batch-mode -f pom.xml help:evaluate -Dexpression=project.version。预先感谢您的帮助。

所以我build.sbt包含几个项目,现在我试图使用sbt projectssbt inspectSBT检查建造,但至今没有运气。

我设法从项目中获取关键值,但是现在我遇到了问题packageName in Docker。我做到了:sbt [project_name]/[key]但是因为packageName in Docker我得到了:

sbt projectName/packageName in Docker
[error] Not a valid command: in
[error] Expected 'info'
[error] Not a valid project ID: in
[error] Expected ':' (if selecting a configuration)
[error] Not a valid key: in
[error] in
[error]   ^
Run Code Online (Sandbox Code Playgroud)

这是build.sbt的一部分:

lazy val `name` = project
  .in(file("name"))
  .dependsOn(`name-dep`)
  .settings(defaults)
  .settings(
    packageName in Docker := "project/name",
    version := "3.1.0-SNAPSHOT",
    dockerExposedPorts := Seq(8080),
    dockerCommands ++= Seq(
      Cmd("ENTRYPOINT",
        s"bin/${executableScriptName.value}",
        "-l", "tcp://0.0.0.0:8081",
        "-e", "${EXTERNAL_URL}",
        "-c", "${CONNECTOR_URL}")
    ),
Run Code Online (Sandbox Code Playgroud)

对于版本,我使用:

sbt name/version
[info] Loading project definition from /home/jenkins/.jenkins/workspace/project
[info] Set current project to root (in build file:/home/jenkins/.jenkins/workspace/)
[info] 3.1.0-SNAPSHOT
Run Code Online (Sandbox Code Playgroud)

但我有问题 packageName in Docker

我的解决方案:

所以我设法通过以下方式获得这些值:

# sbt -Dsbt.log.noformat=true name/packageName | sed -n 3p | cut -d " " -f 2
name
Run Code Online (Sandbox Code Playgroud)

它不会显示整个packageName(不带project/),但是据我所知,这是一个常量,我会在CI脚本中对其进行硬编码。

# sbt -Dsbt.log.noformat=true name/version | sed -n 3p | cut -d " " -f 2
3.1.0-SNAPSHOT
Run Code Online (Sandbox Code Playgroud)

如果有人有更好的主意,请与我分享。

小费

请注意,sbt我使用ASCII代码对输出进行着色,因此请像在我的解决方案中那样使用它,您必须在sbt上运行,-Dsbt.log.noformat=true否则CI可能会抱怨ENV的值,并且您不会看到此信息。

Bal*_*laB 1

我的建议是使用sbt-native-packager

这个打包器还获得了Docker 插件

这为您提供了 sbt 构建上的开箱即用的 docker 镜像以及版本号。我们在所有模块中都使用 sbt-package-manager。