如何根据不同的 sbt 命令设置 SettingKey 的值?

Posted

技术标签:

【中文标题】如何根据不同的 sbt 命令设置 SettingKey 的值?【英文标题】:How to set the value of a SettingKey based on different sbt commands? 【发布时间】:2017-06-07 07:29:46 【问题描述】:

有来自 flywaydb.org 的命令 sbt flywayMigrate。该命令需要预先设置flywayUrlflywayUserflywayPassword。到目前为止还不错。

现在我希望能够将sbt flywayMigrate 用于两种不同的环境;它们的变量应该不同。

我尝试创建两个新命令:sbt flywayMigrateDevsbt flywayMigrateProd。我不知道如何将新命令连接到flywayMigrate

我尝试创建一个新范围。但我不知道如何正确连接变量和任务。

我想知道是否有人可以给我一个如何做到这一点的例子。我想看一个代码示例。

我们可以将问题简化为:

命令sbt flywayMigrate 依赖于flywayUrl。我们如何通过调用 sbt 命令(或任何其他方式也不错)允许命令使用不同的flywayUrls?

谢谢!

【问题讨论】:

【参考方案1】:

您应该为此使用config

示例.sbt 文件内容:

// Set up your configs.
lazy val prodConfig = config("prod")
lazy val devConfig = config("dev")

// Set up any configuration that's common between dev and prod.

val commonFlyway = Seq(
  // For the sake of example, a couple of shared settings.
  flywayUser := "pg_admin",
  flywayLocations := Seq("filesystem:migrations")
)

// Set up prod and dev.
inConfig(prodConfig)(flywayBaseSettings(prodConfig) ++ commonFlyway)
flywayUrl.in(prodConfig) := "jdbc:etc:proddb.somecompany.com"
// Or however you want to load your production password.
flywayPassword.in(prodConfig) := sys.env.getOrElse("PROD_PASSWD", "(unset)")

inConfig(devConfig)(flywayBaseSettings(prodConfig) ++ commonFlyway)
flywayUrl.in(devConfig) := "jdbc:etc:devdb.somecompany.com"
flywayPassword.in(devConfig) := "development_passwd"

现在您可以运行 prod:flywayMigratedev:flywayMigrate 分别迁移生产和开发。

有关其他示例,请参阅 the Flyway docs page。

【讨论】:

我刚刚问了另一个类似的问题:***.com/questions/42738849/… 感谢您在这里提出更好的解决方案。 您是如何学会这样做的?我正在浏览 SBT 文档,但无法弄清楚。我很想知道你是如何学会它的。 旧的示例代码正是我在自己的sbt 配置中所拥有的。我更新了示例代码以匹配最新版本的 Flyway 插件,并添加了相关文档的链接。 你用的是哪个版本的插件?

以上是关于如何根据不同的 sbt 命令设置 SettingKey 的值?的主要内容,如果未能解决你的问题,请参考以下文章

如何将环境配置文件配置添加到 SBT

如何使用 sbt-native-packager 创建基本项目设置

在元构建级别上运行sbt命令

为子项目运行 sbt 命令/设置插件中的每个命令?

使用 SBT,我怎样才能拥有两个具有不同设置的不同 proguard 任务?

如何让 SBT 并行运行测试套件?