【问题标题】:How to share version values between project/plugins.sbt and project/Build.scala?如何在 project/plugins.sbt 和 project/Build.scala 之间共享版本值?
【发布时间】:2014-07-19 14:15:59
【问题描述】:

我想在 sbtPlugin 和构建的其余部分之间共享一个通用版本变量

这是我正在尝试的:

project/Build.scala:

object Versions {
  scalaJs = "0.5.0-M3"
}
object MyBuild extends Build {
  //Use version number
}

plugins.sbt:

addSbtPlugin("org.scala-lang.modules.scalajs" % "scalajs-sbt-plugin" % Versions.scalaJs)

结果

plugins.sbt:15: error: not found: value Versions
addSbtPlugin("org.scala-lang.modules.scalajs" % "scalajs-sbt-plugin" % Versions.scalaJs)

有没有办法在plugins.sbt 和构建的其余部分之间共享版本号规范,例如project/Build.scala?

【问题讨论】:

  • OP 能否评论为什么收到赏金的答案不是公认的答案?这纯粹是时间问题吗?
  • 说实话我不记得了。正如您所建议的那样,这可能是一个时间问题,但此时已经有几年了,我所拥有的用例(在两者之间共享一个 ScalaJS 版本)不再是我必须要做的事情。抱歉,我知道这可能不是一个非常令人满意的回答,但这是我能提供的唯一诚实的回答。

标签: sbt


【解决方案1】:

sbt-buildinfo

如果您需要在build.sbthello.scala 之间共享version 号码,您通常会怎么做?我不了解你,但我会使用我写的sbt-buildinfo

这可以使用buildInfoKeys 设置来配置,以公开任意键值,例如version 或一些自定义String 值。我知道这不是您要问的,但请耐心等待。

meta-build(乌龟一路向下)

正如Jacek notedGetting Started Guide 中所述,sbt 中的构建是在位于project 目录下一层的构建中定义的项目。为了区分构建,让我们将正常构建定义为 proper build,将定义正确构建的构建定义为 meta-build。例如,我们可以说 sbt 插件是元构建中根项目的库。

现在让我们回到您的问题。我们如何在project/Build.scalaproject/plugins.sbt 之间共享信息?

使用 sbt-buildinfo 进行元构建

我们可以通过创建project/project 并将sbt-buildinfo 添加到(元)元构建中来定义另一个构建级别。

这是文件。

project/project/buildinfo.sbt:

addSbtPlugin("com.eed3si9n" % "sbt-buildinfo" % "0.3.2")

project/project/Dependencies.scala:

package metabuild

object Dependencies {
  def scalaJsVersion = "0.5.0-M2"
}

project/build.properties:

sbt.version=0.13.5

project/buildinfo.sbt:

import metabuild.Dependencies._

buildInfoSettings

sourceGenerators in Compile <+= buildInfo

buildInfoKeys := Seq[BuildInfoKey]("scalaJsVersion" -> scalaJsVersion)

buildInfoPackage := "metabuild"

project/scalajs.sbt:

import metabuild.Dependencies._

addSbtPlugin("org.scala-lang.modules.scalajs" % "scalajs-sbt-plugin" % scalaJsVersion)

project/Build.scala:

import sbt._
import Keys._
import metabuild.BuildInfo._

object Builds extends Build {
  println(s"test: $scalaJsVersion")
}

所以project/buildinfo.sbt 中有一些样板,但版本信息在构建定义和插件声明之间共享。

如果您想知道BuildInfo 的定义位置,请查看project/target/scala-2.10/sbt-0.13/src_managed/

【讨论】:

  • 我是否正确理解了没有源生成 metabuild.DependenciesBuild.scala 中不可见?
  • 对于 sbt 1.x,将 buildInfoSettings; sourceGenerators in Compile &lt;+= buildInfo 替换为 enablePlugins(BuildInfoPlugin)
  • &gt; I don't know about you, but I would 多么奇怪的开始回答方式?
【解决方案2】:

对于project/plugins.sbt 文件,您必须在project 下拥有另一个projectVersions.scala 文件。这将使Versions.scalaJs 的定义可见。

这样做的原因是*.sbt文件属于当前级别的项目构建定义,*.scala文件在project下进行扩展。它是...turtles all the way down,即sbt is recursive

我不确定以下内容有多大帮助,但可能值得一试——在项目之间共享版本——plugins 和主要版本——你必须使用ProjectRef,如中所述RootProject and ProjectRef的答案:

当您想直接包含其他单独的构建而不是 使用他们发布的二进制文件,您可以使用“源依赖项”。这是 RootProjectProjectRef 声明了什么。 ProjectRef是最 一般:您指定构建的位置(URI)和ID 您要依赖的构建(字符串)中的项目。 RootProject 是一个方便的选择根项目的 在您指定的 URI 上构建。

【讨论】:

    【解决方案3】:

    我的建议是破解。例如,在build.sbt 中可以添加一个任务:

    val readPluginSbt = taskKey[String]("Read plugins.sbt file.")
    
    readPluginSbt := {
            val lineIterator = scala.io.Source.fromFile(new java.io.File("project","plugins.sbt")).getLines
                val linesWithValIterator = lineIterator.filter(line => line.contains("scalaxbVersion"))
                val versionString =  linesWithValIterator.mkString("\n").split("=")(1).trim
                val version = versionString.split("\n")(0) // only val declaration
            println(version)
            version
        }
    

    当您调用readPluginSbt 时,您将看到plugins.sbt 的内容。您可以解析此文件并提取变量。

    例如:

    resolvers += Resolver.sonatypeRepo("public")
    
    val scalaxbVersion = "1.1.2"
    
    addSbtPlugin("org.scalaxb" % "sbt-scalaxb" % scalaxbVersion)
    
    addSbtPlugin("org.xerial.sbt" % "sbt-pack" % "0.5.1")
    

    可以用正则表达式提取scalaxbVersion/拆分:

    scala> val line = """val scalaxbVersion = "1.1.2""""
    line: String = val scalaxbVersion = "1.1.2"
    
    scala>  line.split("=")(1).trim
    res1: String = "1.1.2"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-11-29
      • 2014-07-17
      • 2020-07-05
      • 1970-01-01
      • 2015-12-15
      • 2019-03-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多