Playframework 2.0 为什么sbt运行时会抛出与Slick';重叠的输出目录;s代码生成器?

Playframework 2.0 为什么sbt运行时会抛出与Slick';重叠的输出目录;s代码生成器?,playframework-2.0,sbt,slick,Playframework 2.0,Sbt,Slick,我正在尝试从anorm迁移到Slick 2。我想用 这是我的project/build.scala import sbt._ import Keys._ object build extends Build { lazy val mainProject = Project( id = "main", base = file("."), settings = Defaults.coreDefaultSettings ++ Seq( scalaVersio

我正在尝试从anorm迁移到Slick 2。我想用

这是我的
project/build.scala

import sbt._
import Keys._

object build extends Build {

  lazy val mainProject = Project(
    id = "main",
    base = file("."),
    settings = Defaults.coreDefaultSettings ++ Seq(
      scalaVersion := "2.10.4",
      libraryDependencies ++= List(
        "com.typesafe.slick" %% "slick" % "2.0.2",
        "org.slf4j" % "slf4j-nop" % "1.6.4",
        "com.h2database" % "h2" % "1.3.170"
      ),
      // register manual sbt command
      slick <<= slickCodeGenTask,
      // register automatic code generation on every compile, remove for only manual use
      sourceGenerators in Compile <+= slickCodeGenTask
    )
  )

  // Slick's code generation task
  lazy val slick = TaskKey[Seq[File]]("gen-tables")

  lazy val slickCodeGenTask = (sourceManaged, dependencyClasspath in Compile, runner in Compile, streams) map { (dir, cp, r, s) =>
    // place generated files in sbt's managed sources folder
    val outputDir = (dir / "slick").getPath
    // connection info for a pre-populated throw-away, in-memory db for this demo, which is freshly initialized on every run
    val url = "jdbc:h2:mem:test;INIT=runscript from 'conf/sql/create.sql'"
    val jdbcDriver = "org.h2.Driver"
    val slickDriver = "scala.slick.driver.H2Driver"
    val pkg = "demo"
    toError(r.run("scala.slick.model.codegen.SourceCodeGenerator", cp.files, Array(slickDriver, jdbcDriver, url, outputDir, pkg), s.log))
    val fname = outputDir + "/demo/Tables.scala"
    Seq(file(fname))
  }
}
import play.PlayScala
import sbt._
import Keys._


object myBuild extends Build {

    lazy val mainProject = Project(
        id = "main",
        base = file("."),
        settings = Defaults.coreDefaultSettings ++ Seq(
            scalaVersion := "2.10.4",
            libraryDependencies ++= List(
                "com.typesafe.slick" %% "slick" % "2.0.2",
                "org.slf4j" % "slf4j-nop" % "1.6.4",
                "com.h2database" % "h2" % "1.3.170"
            ),
            slick <<= slickCodeGenTask, // register manual sbt command
            sourceGenerators in Compile <+= slickCodeGenTask // register automatic code generation on every compile, remove for only manual use
        )
    ).enablePlugins(PlayScala)

    // code generation task
    lazy val slick = TaskKey[Seq[File]]("gen-tables")

    lazy val slickCodeGenTask = (sourceManaged, dependencyClasspath in Compile, runner in Compile, streams) map { (dir, cp, r, s) =>
        val outputDir = (dir / "slick").getPath // place generated files in sbt's managed sources folder
        val url = "jdbc:h2:mem:test;INIT=runscript from 'conf/sql/create.sql'" // connection info for a pre-populated throw-away, in-memory db for this demo, which is freshly initialized on every run
        val jdbcDriver = "org.h2.Driver"
        val slickDriver = "scala.slick.driver.H2Driver"
        val pkg = "demo"
        toError(r.run("scala.slick.model.codegen.SourceCodeGenerator", cp.files, Array(slickDriver, jdbcDriver, url, outputDir, pkg), s.log))
        val fname = outputDir + "/demo/Tables.scala"
        Seq(file(fname))
    }

}
如果我将
id=“main”
更改为
id=“root”
将不再触发上一个错误,而是触发一个新错误:

java.lang.RuntimeException: No main class detected.
    at scala.sys.package$.error(package.scala:27)
[trace] Stack trace suppressed: run last compile:run for the full output.
[error] (compile:run) No main class detected.
[error] Total time: 1 s, completed 08-Jun-2014 20:22:41

项目ID(不管是什么)似乎有问题。我缺少什么?

根目录中是否也有build.sbt文件?比如这里。这可以解释重叠的输出目录错误。删除build.sbt中定义的项目根,以便使用build.scala中的项目


接下来,我猜在第二部分将id从“main”更改为“root”会出现新的错误,因为您有一个play项目,但“mainProject”在Build.scala中定义没有Play插件,因此
run
的行为不同。

解决方案是从
Build.sbt
中删除
root
声明,并在
Build.scala
中启用
PlayScala
插件

build.sbt

name := "computer-database"

version := "1.0"

libraryDependencies ++= Seq(
    jdbc,
    anorm,
    "com.typesafe.slick" %% "slick" % "2.0.2",
    "com.typesafe.play" %% "play-slick" % "0.7.0-M1"
)

scalaVersion := Option(System.getProperty("scala.version")).getOrElse("2.10.4")
project/Build.scala

import sbt._
import Keys._

object build extends Build {

  lazy val mainProject = Project(
    id = "main",
    base = file("."),
    settings = Defaults.coreDefaultSettings ++ Seq(
      scalaVersion := "2.10.4",
      libraryDependencies ++= List(
        "com.typesafe.slick" %% "slick" % "2.0.2",
        "org.slf4j" % "slf4j-nop" % "1.6.4",
        "com.h2database" % "h2" % "1.3.170"
      ),
      // register manual sbt command
      slick <<= slickCodeGenTask,
      // register automatic code generation on every compile, remove for only manual use
      sourceGenerators in Compile <+= slickCodeGenTask
    )
  )

  // Slick's code generation task
  lazy val slick = TaskKey[Seq[File]]("gen-tables")

  lazy val slickCodeGenTask = (sourceManaged, dependencyClasspath in Compile, runner in Compile, streams) map { (dir, cp, r, s) =>
    // place generated files in sbt's managed sources folder
    val outputDir = (dir / "slick").getPath
    // connection info for a pre-populated throw-away, in-memory db for this demo, which is freshly initialized on every run
    val url = "jdbc:h2:mem:test;INIT=runscript from 'conf/sql/create.sql'"
    val jdbcDriver = "org.h2.Driver"
    val slickDriver = "scala.slick.driver.H2Driver"
    val pkg = "demo"
    toError(r.run("scala.slick.model.codegen.SourceCodeGenerator", cp.files, Array(slickDriver, jdbcDriver, url, outputDir, pkg), s.log))
    val fname = outputDir + "/demo/Tables.scala"
    Seq(file(fname))
  }
}
import play.PlayScala
import sbt._
import Keys._


object myBuild extends Build {

    lazy val mainProject = Project(
        id = "main",
        base = file("."),
        settings = Defaults.coreDefaultSettings ++ Seq(
            scalaVersion := "2.10.4",
            libraryDependencies ++= List(
                "com.typesafe.slick" %% "slick" % "2.0.2",
                "org.slf4j" % "slf4j-nop" % "1.6.4",
                "com.h2database" % "h2" % "1.3.170"
            ),
            slick <<= slickCodeGenTask, // register manual sbt command
            sourceGenerators in Compile <+= slickCodeGenTask // register automatic code generation on every compile, remove for only manual use
        )
    ).enablePlugins(PlayScala)

    // code generation task
    lazy val slick = TaskKey[Seq[File]]("gen-tables")

    lazy val slickCodeGenTask = (sourceManaged, dependencyClasspath in Compile, runner in Compile, streams) map { (dir, cp, r, s) =>
        val outputDir = (dir / "slick").getPath // place generated files in sbt's managed sources folder
        val url = "jdbc:h2:mem:test;INIT=runscript from 'conf/sql/create.sql'" // connection info for a pre-populated throw-away, in-memory db for this demo, which is freshly initialized on every run
        val jdbcDriver = "org.h2.Driver"
        val slickDriver = "scala.slick.driver.H2Driver"
        val pkg = "demo"
        toError(r.run("scala.slick.model.codegen.SourceCodeGenerator", cp.files, Array(slickDriver, jdbcDriver, url, outputDir, pkg), s.log))
        val fname = outputDir + "/demo/Tables.scala"
        Seq(file(fname))
    }

}
import play.PlayScala
进口sbt_
导入密钥_
对象myBuild扩展了Build{
懒惰val mainProject=Project(
id=“main”,
base=文件(“.”),
设置=默认值。coreDefaultSettings++序号(
scalaVersion:=“2.10.4”,
libraryDependencies++=列表(
“com.typesafe.slick”%%“slick”%%“2.0.2”,
“org.slf4j”%“slf4j nop”%“1.6.4”,
com.h2数据库“%”h2“%”1.3.170
),

slick最好从配置加载这些设置:

app/db.conf

db.default.driver=org.h2.Driver
db.default.url="jdbc:h2:mem:test;INIT=runscript from 'db.sql'"
db.default.user=sa
db.default.password=""
db.slick.driver = "scala.slick.driver.H2Driver"

# From root
db.model.package = "models"
db.model.outputDir = "app" # not include package
db.model.outputFile = "Tables.scala"
build.sbt

object myBuild extends Build {
  lazy val slick = TaskKey[Seq[File]]("gen-tables")

  lazy val config = ConfigFactory.parseFile(new File("./conf/db.conf"))

  lazy val slickCodeGenTask = (sourceManaged, dependencyClasspath in Compile, runner in Compile, streams) map { (dir, cp, r, s) =>

    val outputDir = config.getString("db.model.outputDir") // place generated files in sbt's managed sources folder
    val url = config.getString("db.default.url")
    val jdbcDriver = config.getString("db.default.driver")
    val slickDriver = config.getString("db.slick.driver")
    val pkg = config.getString("db.model.package")
    toError(r.run("scala.slick.codegen.SourceCodeGenerator", cp.files, Array(slickDriver, jdbcDriver, url, outputDir, pkg), s.log))
    val fname = outputDir + config.getString("db.model.outputFile")
    Seq(file(fname))
  }

  lazy val mainProject = Project(
    id="main",
    base=file("."),
    settings = Defaults.coreDefaultSettings ++ Seq(
      slick <<= slickCodeGenTask
      // sourceGenerators in Compile <+= slickCodeGenTask
    )).enablePlugins(PlayScala)
}
对象myBuild扩展了Build{
lazy val slick=TaskKey[Seq[File]](“gen tables”)
lazy val config=ConfigFactory.parseFile(新文件(“./conf/db.conf”))
lazy val slickCodeGenTask=(sourceManaged,dependencyClasspath in Compile,runner in Compile,streams)map{(dir,cp,r,s)=>
val outputDir=config.getString(“db.model.outputDir”)//将生成的文件放在sbt的托管源文件夹中
val url=config.getString(“db.default.url”)
val jdbcDriver=config.getString(“db.default.driver”)
val slickDriver=config.getString(“db.slick.driver”)
val pkg=config.getString(“db.model.package”)
toError(r.run(“scala.slick.codegen.SourceCodeGenerator”、cp.files、数组(slickDriver、jdbcDriver、url、outputDir、pkg)、s.log))
val fname=outputDir+config.getString(“db.model.outputFile”)
Seq(文件(fname))
}
懒惰val mainProject=Project(
id=“main”,
base=文件(“.”),
设置=默认值。coreDefaultSettings++序号(

slick是的,我确实有相同的build.sbt,但是从中删除
root
不会改变任何东西,仍然是完全相同的错误。
clean
然后
run
?同一位置文件(“.”)不应该在多个位置创建项目(build.sbt,build.scala)是的,
clean
run
,没有更改。不确定问题出在哪里。如果删除了
build.sbt
中定义的项目
root
,则不应该再在堆栈跟踪中获得这一行:
ProjectRef(文件:/home/myuser/computer database/,root)
。如果您使用的是git repo,您可以做的最后一件事是git clean-dxf,然后尝试运行
sbt
我一直在阅读sbt文档(),如果我理解正确,我的Build.scala文件对于Play 2.3/sbt 0.13.5是错误的。不过,这在Play 2.2上是可行的。我只是在Play 2.3下没有Build.scala的示例