从 sbt 0.13 开始,定义所有配置的推荐方法是multi-project .sbt build definition。如何为每个项目定义设置是绝对清楚的;但是,应该如何定义构建范围的设置,例如,inThisBuild或Globalscopes?
使用 Scala 构建定义很清楚:我们有settings来自Buildtrait 的关键:
object MyBuild extends Build {
override lazy val settings = super.settings ++ Seq(
someKey := someValue
)
}
Run Code Online (Sandbox Code Playgroud)
someKey默认情况下,Now的值将是构建范围的。或者,它可以直接在.sbt具有ThisBuild范围的文件中定义:
someKey in ThisBuild := someValue
Run Code Online (Sandbox Code Playgroud)
但是,在多项目.sbt构建中没有自然的地方来定义这些选项。我怀疑它们应该在具有ThisBuild范围的项目之一中定义:
val someProject = project
.settings(someKey in ThisBuild := someValue)
Run Code Online (Sandbox Code Playgroud)
但这是非常违反直觉的,也不是很清楚:这些设置真的适用于全球还是真的属于特定项目?如果我在多个项目中定义相同的键怎么办?
val project1 = project.settings(someKey in ThisBuild := someValue1)
val project2 = project.settings(someKey in ThisBuild := someValue2)
Run Code Online (Sandbox Code Playgroud)
不幸的是,文档对此没有给出任何答案。
请注意,我没有明确询问如何在构建或项目之间共享全局设置。我专门询问定义构建范围的设置。
好吧,我进行了一些实验并发现了以下内容。这是一个例子build.sbt:
val testKey = settingKey[String]("A key for test")
testKey := "value in build.sbt"
testKey in ThisBuild := "build-scoped value in build.sbt"
testKey in Global := "global value in build.sbt"
lazy val root = (project in file("."))
.settings(
testKey := "value in root project",
testKey in ThisBuild := "build-scoped value in root project",
testKey in Global := "global value in root project"
)
lazy val child = project
.settings(
testKey := "value in child",
testKey in ThisBuild := "build-scoped value in child project",
testKey in Global := "global value in child project"
)
Run Code Online (Sandbox Code Playgroud)
这是我在 SBT 控制台中看到的:
val testKey = settingKey[String]("A key for test")
testKey := "value in build.sbt"
testKey in ThisBuild := "build-scoped value in build.sbt"
testKey in Global := "global value in build.sbt"
lazy val root = (project in file("."))
.settings(
testKey := "value in root project",
testKey in ThisBuild := "build-scoped value in root project",
testKey in Global := "global value in root project"
)
lazy val child = project
.settings(
testKey := "value in child",
testKey in ThisBuild := "build-scoped value in child project",
testKey in Global := "global value in child project"
)
Run Code Online (Sandbox Code Playgroud)
所以,结论如下。
build.sbt所属项目。即这里build.sbt是在根目录下,testKey直接在文件中定义和在(project in file(".")).settings(...)子句中定义是一样的。根据 SBT 输出,它们也优先于.settings(...).ThisBuild或Global似乎能够在任何项目中定义,但“稍后”的项目将优先。这可能与处理项目的顺序有关。我预计lazy vals的评估顺序会影响这一点,并且我尝试添加.aggregate(child)到根项目以强制首先评估子项目,但它似乎没有任何影响:来自 child 的全局范围值项目还是有优先权的。因此,在根项目或通用设置列表中定义构建范围或全局范围的值似乎很好,然后在每个项目中使用。但是,在不同项目中为构建中的键或全局范围分配不同的值可能会导致奇怪的行为 - 这些值中只有一个会生效,而我不知道哪个值会生效。
如果所有这些都在文档中得到解释,那就太好了,但目前我在那里找不到任何关于这种行为的信息。
我很乐意接受其他人的回答,这将提供有关 SBT 在这方面如何工作的更多见解。
| 归档时间: |
|
| 查看次数: |
1436 次 |
| 最近记录: |