我想在运行时在插件中添加一个配置,并且可能还会在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 )
。但是对于这一步,我没有想法。