通过 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")
在其他任务或设置中获取您的配置值。
我正在阅读这个示例,它向我展示了如何使用 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")
在其他任务或设置中获取您的配置值。