通过 SBT 生成 Slick 代码时读取配置文件

Read config file while generating Slick code via SBT

我正在阅读这个示例,它向我展示了如何使用 Slick-CodeGen 生成源代码

https://github.com/slick/slick-codegen-example/blob/master/build.sbt

虽然这个示例很好,但我想修改它,以便它使用类型安全配置从 application.conf 读取数据库配置。

否则我将不得不在此处以及 application.conf 文件中复制数据库连接配置。

有谁知道,如何修改这个示例,以便我们可以使用类型安全配置从 application.conf 读取配置值?

编辑:根据下面的建议,我尝试了以下

我在项目文件夹中创建了一个名为 build.sbt 的文件

libraryDependencies += "com.typesafe" % "config" % "1.3.1"

将我的主要 build.sbt 文件(在项目根目录中)修改为

val slickVersion = "3.1.1"

lazy val mainProject = Project(
   id = "FooBar",
   base=file("."),
   settings = Defaults.coreDefaultSettings ++ Seq(
      scalaVersion := "2.11.8",
      libraryDependencies ++= Seq(
         "com.typesafe.slick" %% "slick" % slickVersion,
         "com.typesafe.slick" %% "slick-codegen" % slickVersion,
         "mysql" % "mysql-connector-java" % "5.1.35",
         "com.typesafe" % "config" % "1.3.1"
      ),
      myConf := {
         ConfigFactory.parseFile(new File("src/main/resources/application.conf"))
      },
      slick <<= slickCodeGenTask,
      sourceGenerators in Compile <+= slickCodeGenTask
   )
)

lazy val slick = TaskKey[Seq[File]]("gen-tables")
lazy val myConf = settingKey[Config]("The application properties")

lazy val slickCodeGenTask = (sourceManaged, dependencyClasspath in Compile, runner in Compile, streams) map {(dir, cp, r, s) =>
   val outputDir = (dir / "slick").getPath
   val username = myConf.value.getString("mysql.username")
   val password = myConf.value.getString("mysql.password")
   val port = myConf.value.getInt("mysql.port")
   val db = myConf.value.getString("mysql.db")
   val server = myConf.value.getString("mysql.server")
   val url = s"jdbc:mysql://$server:$port/$db?username=$username&password=$password"
   val jdbcDriver = myConf.value.getString("mysql.jdbcDriver")
   val slickDriver = myConf.value.getString("mysql.slickDriver")
   val pkg = "sql"
   val fname = outputDir + "/db/Tables.scala"
   toError(r.run("slick.codegen.SourceCodeGenerator", cp.files, Array(slickDriver, jdbcDriver, url, outputDir, pkg), s.log))
   Seq(file(fname))
}

但它无法解析 Config 和 ConfigFactory 类。

project/build.sbt 中声明对类型安全配置的依赖:

libraryDependencies += "com.typesafe" % "config" % "1.3.1"

并在 build.sbt 中定义一个包含您的配置文件的设置:

lazy val myConf = settingKey[Config]("The application properties")

myConf := {
    ConfigFactory.parseFile(new File("src/main/resources/application.conf"))
}

现在您可以使用 myConf.value.getString("xyz") 在其他任务或设置中获取您的配置值。