如何声明2个自定义sbt设置,比如A和B,在Global配置范围内定义B ,其内容依赖于A,在几个配置范围中以不同方式定义A,使得每个配置中B的结果值不同虽然B只定义一次?
考虑下面的示例targetHost,与remote其他配置中的定义不同,scriptContent具体取决于:
object MyBuild extends Build {
lazy val remote = config("remote") describedAs ("configuration for remote environement ")
lazy val targetHost = settingKey[String]("private hostname of master server")
lazy val scriptContent = settingKey[String]("Some deployment script")
lazy val root: Project = Project("meme", file(".")).
settings(
name := "hello",
targetHost := "localhost",
targetHost in remote := "snoopy",
scriptContent := s"""
# some bash deployment here
/usr/local/uberDeploy.sh ${targetHost.value}
"""
)
}
Run Code Online (Sandbox Code Playgroud)
我想scriptContent有两个配置范围不同的值,但因为它依赖于targetHost在Global范围内的值总是相同的:
> scriptContent
[info]
[info] # some bash deployment here
[info] /usr/local/uberDeploy.sh localhost
[info]
> remote:scriptContent
[info]
[info] # some bash deployment here
[info] /usr/local/uberDeploy.sh localhost
[info]
Run Code Online (Sandbox Code Playgroud)
而我想获得以下内容:
> scriptContent
[info]
[info] # some bash deployment here
[info] /usr/local/uberDeploy.sh localhost
[info]
> remote:scriptContent
[info]
[info] # some bash deployment here
[info] /usr/local/uberDeploy.sh snoopy
[info]
Run Code Online (Sandbox Code Playgroud)
找到了!我的问题实际上是重复的(抱歉...),最相关的答案在这里:How can i make an SBT key see settings for the current configuration?
=> 我们需要多次应用设置,每个范围一次,以强制重新评估 的内容scriptSetting:
import sbt._
import sbt.Keys._
object MyBuild extends Build {
lazy val remote = config("remote") describedAs ("configuration for remote environement ")
lazy val targetHost = settingKey[String]("private hostname of master server")
lazy val scriptContent = settingKey[String]("Some deployment script")
lazy val scriptSettings = Seq(
scriptContent := s"""
# some bash deployment here
/usr/local/uberDeploy.sh ${targetHost.value}
"""
)
lazy val root: Project = Project("meme", file("."))
.settings(
name := "hello",
targetHost := "localhost",
targetHost in remote := "snoopy"
)
.settings(scriptSettings: _*)
.settings(inConfig(remote)(scriptSettings) :_*)
}
Run Code Online (Sandbox Code Playgroud)
产生预期结果:
> scriptContent
[info]
[info] # some bash deployment here
[info] /usr/local/uberDeploy.sh localhost
[info]
> remote:scriptContent
[info]
[info] # some bash deployment here
[info] /usr/local/uberDeploy.sh snoopy
[info]
>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
63 次 |
| 最近记录: |