【问题标题】:adding task to sbt 13.x build.sbt将任务添加到 sbt 13.x build.sbt
【发布时间】:2015-03-12 15:03:53
【问题描述】:

我已将此添加到 build.sbt

libraryDependencies += "com.typesafe.slick" %% "slick-codegen" % "2.1.0"

lazy val slickGenerate = TaskKey[Seq[File]]("slick code generation")

slickGenerate <<= slickGenerateTask 

lazy val slickGenerateTask = {
    (sourceManaged in Compile, dependencyClasspath in Compile, runner in Compile, streams) map { (dir, cp, r, s) =>
      val dbName = "dbname"
      val userName = "user"
      val password = "password"
      val url = s"jdbc:mysql://server:port/$dbName" 
      val jdbcDriver = "com.mysql.jdbc.Driver"
      val slickDriver = "scala.slick.driver.MySQLDriver"
      val targetPackageName = "models"
      val outputDir = (dir / dbName).getPath // place generated files in sbt's managed sources folder
      val fname = outputDir + s"/$targetPackageName/Tables.scala"
      println(s"\nauto-generating slick source for database schema at $url...")
      println(s"output source file file: file://$fname\n")
      r.run("scala.slick.codegen.SourceCodeGenerator", cp.files, Array(slickDriver, jdbcDriver, url, outputDir, targetPackageName, userName, password), s.log)
      Seq(file(fname))
    }
}

任务的代码本身并不是很令人兴奋。它只需要创建一个自动生成的 scala 源文件。问题是,sbt 启动正常,但是这个新任务显然 not 被 sbt 识别,并且不能在 sbt 提示符下运行。我对任务定义的:= 语法也不太满意。现有的文档令人困惑。

如何使这个新任务在 sbt 提示符下可用?

【问题讨论】:

  • 那么,我的回答对您有帮助吗,还是还有其他问题?
  • 在我的堆栈中实现(并因此验证)这个......我应该接受它以实现赏金吗?
  • 我对解决问题更感兴趣,但赏金也会很棒:) - 我通过你打开它以快速解决问题
  • 不,我打开它是为了在上下文切换回来后找到一个解决方案,因为让它无限期地损坏是不可思议的。既然我认为它对你有用,让我现在“接受”它:) 再次感谢,这真的很有帮助!

标签: scala sbt


【解决方案1】:

这行得通

libraryDependencies += "com.typesafe.slick" %% "slick-codegen" % "2.1.0"

lazy val slickGenerate = taskKey[Seq[File]]("slick code generation")

slickGenerate := {
  val dbName = "dbname"
  val userName = "user"
  val password = "password"
  val url = s"jdbc:mysql://server:port/$dbName"
  val jdbcDriver = "com.mysql.jdbc.Driver"
  val slickDriver = "scala.slick.driver.MySQLDriver"
  val targetPackageName = "models"
  val outputDir = ((sourceManaged in Compile).value / dbName).getPath // place generated files in sbt's managed sources folder
  val fname = outputDir + s"/$targetPackageName/Tables.scala"
  println(s"\nauto-generating slick source for database schema at $url...")
  println(s"output source file file: file://$fname\n")
  (runner in Compile).value.run("scala.slick.codegen.SourceCodeGenerator", (dependencyClasspath in Compile).value.files, Array(slickDriver, jdbcDriver, url, outputDir, targetPackageName, userName, password), streams.value.log)
  Seq(file(fname))
}

sbt 0.13.x 中,您不需要所有这些blabla map sameblabla 样板。只需按原样访问值(runner in Compile).value - 宏将为您做所有其他事情。

> slickGenerate
[info] Updating {file:/Users/user/slick/}slick...
[info] Resolving org.fusesource.jansi#jansi;1.4 ...
[info] Done updating.

auto-generating slick source for database schema at jdbc:mysql://server:port/dbname...
output source file file: file:///Users/user/slick/target/scala-2.10/src_managed/main/dbname/models/Tables.scala

> help slickGenerate
slick code generation

谈论&lt;&lt;= - 你的TaskKey 不正确,见定义:

def apply[T](label : scala.Predef.String, description : scala.Predef.String // not description

所以,旧定义 &lt;&lt;= 使用“生成 slick 代码”作为标签,而新的 := 使用代码给定的命令名称(新样式),因此它使用您的“生成 slick 代码”作为博士。这看起来很奇怪且不一致,但这是事实,部分原因是向后兼容。

所以,正确的旧式版本是:

import sbt.Keys._

lazy val slickGenerate = TaskKey[Seq[File]]("slick-generate", "generate slick code")

slickGenerate <<= slickGenerateTask

def slickGenerateTask =
  (sourceManaged in Compile, dependencyClasspath in Compile, runner in Compile, streams) map { (dir, cp, r, s) =>
    ...
  }

它的工作方式与以前相同。请注意,您必须使用“slickGenerate”,而不是“slick-generate”,最后一个不适用于“help”命令。

顺便说一句,您现在正在使用 Bare build definition - 您可能想要切换到 Multi-project .sbt definition,因为它是 sbt 文档 see also 推荐的。

【讨论】:

  • 再次感谢。确实有效,并感谢相关的 cmets!我想知道我应该怎么做才能将我的构建定义切换到多项目构建定义。文档是一大堆叙述,不确定实现该过渡的实际步骤系列是什么,或者为什么它实际上更好。
猜你喜欢
  • 2015-05-29
  • 2014-09-18
  • 1970-01-01
  • 2018-09-26
  • 2017-06-02
  • 2018-04-13
  • 2011-09-27
  • 1970-01-01
  • 2011-11-12
相关资源
最近更新 更多