我正在使用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设置文档的大量搜索和检查并没有为我解决任何问题。
答案 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控制台上使用限定符。