首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >向SBT13.x build.sbt添加任务

向SBT13.x build.sbt添加任务
EN

Stack Overflow用户
提问于 2015-02-14 02:08:11
回答 1查看 695关注 0票数 4

我已经把这个添加到build.sbt中了

代码语言:javascript
复制
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很好地启动,但是这个新任务显然没有被sbt识别,并且不能在sbt提示符中运行。对于任务定义的:=语法,我的运气也很差。现有的文件只是令人困惑。

如何在sbt提示符中提供这个新任务?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-03-05 15:54:02

这行得通

代码语言:javascript
复制
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一样访问值-宏将为您完成其他一切。

代码语言:javascript
复制
> 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

谈到<<= --您的TaskKey是不正确的,请参阅定义:

代码语言:javascript
复制
def apply[T](label : scala.Predef.String, description : scala.Predef.String // not description

因此,旧的定义<<=使用"generate代码“作为标签,而新的:=使用代码指定的命令名称(新样式),因此它使用"generate代码”作为文档。这看起来很奇怪,也不一致,但这是事实,部分原因是向后兼容性。

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

代码语言:javascript
复制
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",而不是“slickGenerate”,最后一个命令对“帮助”不起作用。

顺便说一句,您现在正在使用裸构建定义 --您可能希望切换到多项目.sbt定义,这是sbt,另请参阅推荐的。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28511698

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档