2

我想在运行时在插件中添加一个配置,并且可能还会在projectConfigurations. 有没有可能以这种方式操纵状态?我认为这需要在命令中完成,并且解决方案被埋在深处的某个地方AttributeMap,但我不确定如何接近那个野兽。

def addConfiguration = Command.single( "add-configuration" )( ( state, configuration ) => {
    val extracted = Project extract state
    val c = configurations.apply( configuration )
    // Add c to the state ...
    ???
} )

背景

我正在开发一个sbt-slick-codegen插件,它具有多数据库支持作为基本功能。现在要在 sbt 中配置数据库,我采用了一种非常简单的方法:将所有内容都填充到 Map 中。

databases in SlickCodegen ++= Map(
    "default" -> Database(
        Authentication(
            url = "jdbc:postgresql://localhost:5432/db",
            username = Some( "db_user_123" ),
            password = Some( "p@assw0rd" )
        ),
        Driver(
            jdbc = "org.postgresql.Driver",
            slick = slick.driver.PostgresDriver,
            user = Some( "com.example.MySlickProfile" )
        ),
        container = "Tables",
        generator = new SourceCodeGenerator( _ ),
        identifier = Some( "com.example" ),
        excludes = Seq( "play_evolutions" ),
        cache = true
    ),
     "user_db" -> Database( ... )
)

现在,这可行,但违背了sbt的目的,难以设置,难以维护和更新。我宁愿配置像这样工作:

container in Database := "MyDefaultName",
url in Database( "backup" ) := "jdbc:postgresql://localhost:5432/database",
cache in Database( "default" ) := false

而且这种方法也适用于当前的开发分支,但仅适用Database( x )于编译时已知的配置,这会导致下一个问题:

最重要的是,我计划添加一个支持PlayFramework的模块。这个想法是有一个SettingKey[Seq[Config]]( "configurations" )接受Typesafe Config实例的设置,从它们中读取光滑的配置并生成适当的配置Database( x )。但是对于这一步,我没有想法。

4

0 回答 0