我想在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
?
答案 0 :(得分:12)
如果您需要在version
和build.sbt
之间分享hello.scala
号码,您通常会做什么?我不了解你,但我会使用我写的sbt-buildinfo。
可以使用buildInfoKeys
设置配置此功能,以显示version
或某些自定义String
值等任意键值。我知道这并不是你要问的问题,而是对我不满意。
作为Jacek noted并在Getting Started Guide中说明,sbt中的构建是在位于project
目录中的构建中定义的一级项目。为区分构建,我们将正常构建定义为正确构建,并将构建定义为元构建的正确构建。例如,我们可以说sbt插件是元构建中的根项目库。
现在让我们回到你的问题。我们如何在project/Build.scala
和project/plugins.sbt
之间共享信息?
我们可以通过创建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;。这是
ProjectRef
和ProjectRef
声明了什么。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"