为什么我不能使用SBT更改列出的插件设置的值?

时间:2013-06-14 03:13:30

标签: scala plugins configuration sbt

我正在使用sbt-start-script插件来构建我的项目(虽然我认为这个问题比这更普遍适用;它恰好提供了一个具体的例子)。我想更改start-script-name设置的值(可以找到定义设置的相关源文件here)。根据文档,我在我的build.sbt中添加了以下行,并按预期创建了启动脚本:

import com.typesafe.sbt.SbtStartScript
seq(SbtStartScript.startScriptForClassesSettings: _*)

但是,我想更改start-script-name设置(已定义,令人困惑,为startScriptFile)将其写入其他位置,这比我更令人沮丧期待它。

使用inspect

显示设置正常
[ctdrest] $ inspect uses start-script-name
[info]
[info]  compile:start-script-for-jar
[info]  compile:start-script-not-defined
[ctdrest] $ inspect definitions start-script-name
[info]
[info]  *:start-script-name
[ctdrest] $ inspect tree start-script-name
[info] *:start-script-name = target/start
[info]   +-*:target = target
[info]     +-*:base-directory = /Users/amack/Coding/ctdrest
[info]       +-*:this-project = Project(id: CTDRestful, base: /Users/amack/Coding/ctdrest, aggreg..
[info]

但是当我尝试设置值时,sbt会抱怨:

[ctdrest] $ set startScriptFile := "bar"
<set>:1: error: not found: value startScriptFile
startScriptFile := "bar"
^
<set>:1: error: reassignment to val
startScriptFile := "bar"
            ^
[error] Type error in expression

我认为我错过了一些非常明显的东西,但是对SBT设置文档的大量搜索和检查并没有为我解决任何问题。

1 个答案:

答案 0 :(得分:1)

相当惊人的明显。在这种特殊情况下,您可以从源中看到原始密钥是在嵌套对象StartScriptKeys中定义的:

 object StartScriptKeys {
        val startScriptFile = SettingKey[File]("start-script-name")
        ...
 }

以下是诀窍:

[ctdrest] $ set StartScriptKeys.startScriptFile <<= target / "bar"
[info] Defining *:start-script-name
[info] The new value will be used by compile:start-script-for-jar, compile:start-script-not-defined
[info] Reapplying settings...
[info] Set current project to ctdrest (in build file:/Users/amack/Coding/ctdrest/)

如果给定设置名称(例如start-script-name),这并不能解决确定如何设置值的更一般的问题。在这方面,SBT似乎更有帮助。

修改

根据plugin design guide,通过添加

可以更加惯用处理
import StartScriptKeys._

build.sbt,然后可以在没有限定符的情况下修改startScriptFile,尽管由于某种原因仍然需要在SBT控制台上使用限定符。