【问题标题】:How to depend on a setting in the "current" config如何依赖“当前”配置中的设置
【发布时间】:2015-08-31 00:55:17
【问题描述】:

如何声明 2 个自定义 sbt 设置,比如 A 和 B,在 Global 配置范围中定义 B,其内容取决于 A,在多个配置范围中以不同方式定义 A,使得 B 的结果值尽管 B 只定义了一次,但每个配置都不同?

考虑例如下面的targetHostremote 中的定义与其他配置不同,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}
        """
    )    
}

我希望scriptContent 在两个配置范围内具有不同的值,但由于它依赖于Global 范围内的targetHost,其值始终相同:

> 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] 

而我想获得以下内容:

> 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] 

【问题讨论】:

  • 我猜你需要明确指定任务的范围。例如,在两个作用域中实现两个scriptContent,一个是targetHost in remote,另一个是简单的targetHost

标签: scala sbt


【解决方案1】:

找到了!我的问题实际上是重复的(对不起...),最相关的答案在这里: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) :_*)
}

产生预期的结果:

> 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]
>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-11
    • 2015-04-18
    • 2017-08-04
    • 2013-10-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多