如何在project / plugins.sbt和project / Build.scala之间共享版本值?

时间:2014-05-29 22:31:37

标签: sbt

我想在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

3 个答案:

答案 0 :(得分:12)

SBT-buildinfo

如果您需要在versionbuild.sbt之间分享hello.scala号码,您通常会做什么?我不了解你,但我会使用我写的sbt-buildinfo

可以使用buildInfoKeys设置配置此功能,以显示version或某些自定义String值等任意键值。我知道这并不是你要问的问题,而是对我不满意。

元构建(乌龟一直向下)

作为Jacek noted并在Getting Started Guide中说明,sbt中的构建是在位于project目录中的构建中定义的一级项目。为区分构建,我们将正常构建定义为正确构建,并将构建定义为元构建的正确构建。例如,我们可以说sbt插件是元构建中的根项目库。

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

使用sbt-buildinfo进行元构建

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

以下是文件。

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/

答案 1 :(得分:3)

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

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

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

  

如果要直接包含其他单独的构建而不是   使用他们发布的二进制文件,您可以使用&#34; source dependencies&#34;。这是   ProjectRefProjectRef声明了什么。 RootProject是最多的   general:指定构建的位置(URI)和ID   您希望依赖的构建项目(String)。   {{1}}是一种方便,可以选择根项目   构建您指定的URI。

答案 2 :(得分:2)

我的提议是破解。例如,在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")

您可以使用正则表达式/ split:

提取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"