如何在build.sbt中指定范围

时间:2014-06-23 19:19:04

标签: sbt

我在Global&中定义了一个变量libDir。当我尝试在其中一个子项目中使用它(指定范围)时,它失败了:

[info]从/ Users / chichu / ws / tip / TestMain / project加载项目定义 对未定义设置的引用:

* / *:Streaming / *中的libDir:install(/Users/chinchu/ws/tip/TestMain/build.sbt:124)      你的意思是TestRoot / *:libDir?

这是来自build.sbt的片段:

===

def Streaming(name:String,dir:String,               archiveName:String,main:String):Project = {   ...   ...

install := {
  val jarName = assembly.value
  sbt.IO.copyFile(jarName, (libDir in Global).value) // copy over the jar
}

}

.. ..

lazy val installDir = SettingKeyFile

libDir:= baseDirectory.value /" install / lib"

==

为什么它无法解决" libDir"即使我在Global"中指定" ?我还在TestRoot"中尝试过" libDir。 &安培;它报告"错误:未找到:值TestRoot"

由于 -C

1 个答案:

答案 0 :(得分:2)

规范says,如果您定义如下设置:

libDir := baseDirectory.value / "install/lib"

它会将任务和配置范围设置为Global,但项目范围将设置为当前项目(在您的情况下是根项目)。

当您将设置称为libDir in Global时,您将配置范围设置为Global,但仍然是您在当前版本(即某个项目)中尝试定义{{1}设置。

您应该像这样定义install

libDir

也将项目范围设置为libDir in Global := baseDirectory.value / "install/lib"

示例build.sbt

Global

替代解决方案

或者,您可以为根项目提供一个显式ID,即在您的主lazy val installDir = settingKey[File]("ff") lazy val install = taskKey[Unit]("prints install") installDir in Global := baseDirectory.value / "install/lib" val projectA = project.in(file("projectA")).settings( install := { val install = (installDir in Global).value println(install) } ) val projectB = project 添加一行

build.sbt

然后在您的val root = Project("root", file(".")) 任务中,参考该项目中的installGlobal是项目名称)

root

示例build.sbt

(libDir in Global in root).value