1

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

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

但是,我想更改start-script-name设置(令人困惑地定义为 as 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 设置文档的大量搜索和检查并没有为我清除任何东西。

4

1 回答 1

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 似乎更有帮助。

编辑

根据插件设计指南,这将通过添加更惯用地处理

import StartScriptKeys._

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

于 2013-06-14T05:55:25.310 回答