加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala – 如何依赖“当前”配置中的设置

发布时间:2020-12-16 18:28:36 所属栏目:安全 来源:网络整理
导读:如何声明2个自定义sbt设置,比如A和B,在全局配置范围中定义B,其内容依赖于A,在几个配置范围中以不同方式定义A,使得每个配置中B的结果值不同即使B只定义一次? 考虑下面的targetHost,在远程中定义与在其他配置中不同,并且scriptContent取决于它: object MyBui
如何声明2个自定义sbt设置,比如A和B,在全局配置范围中定义B,其内容依赖于A,在几个配置范围中以不同方式定义A,使得每个配置中B的结果值不同即使B只定义一次?

考虑下面的targetHost,在远程中定义与在其他配置中不同,并且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在两个配置范围中都有不同的值,但由于它依赖于全局范围中的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]

解决方法

找到了!我的问题实际上是重复的(抱歉……),最相关的答案是: 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 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]
>

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读