如何使用scala + play + sbt复制资源

3

我正在使用sbt [0.13]编译一个使用scala [2.10.3]的play [2.2]项目。我有用于数据库迁移的.sql文件和scala文件。目录结构如下:

app
|-> db
     |-> migration
           |-> V1__init.scala
           |-> V2__newTable.sql

当我从Play控制台(REPL)运行编译时,scala文件(V1__init.scala)会被编译成.class并复制到classes文件夹。但是.sql文件没有被移动。
我尝试添加unmanagedResourceDirectories in Compile <++= baseDirectory { dir => Seq(dir/"app/db/migration") ++ Seq(dir/"db/migration") }但它没有复制文件。整个代码块如下:
val main = play.Project(appName, appVersion, appDependencies).settings(
    scalaVersion := "2.10.3",
    scalacOptions ++= Seq("-feature"),   // enable feature warnings
    unmanagedResourceDirectories in Compile <++=  baseDirectory { dir => Seq(dir/"app/db/migration") ++ Seq(dir/"db/migration") }
)

我也尝试使用copyResources,但无法使其工作。在这里有描述:http://www.playframework.com/documentation/2.0/SBTSettings 那么,有人知道我如何将sql文件复制到classes文件夹吗?
谢谢!
更新
我使用IO.copyDirectory(new java.io.File("app/db/migration"), new java.io.File("target/scala-2.10/classes/db/migration"), true)来复制文件,但目标是硬编码的,当我更新scala时会更改。

你考虑过使用 数据库演进的内置支持 吗? - wingedsubmariner
是的,我有,但看起来Evolutions不支持运行任意的Scala代码,而是需要使用.sql文件。 - Jon
你也可以将 SQL 脚本放入 conf 目录中,这样它就会自动加入类路径。 - Schleichardt
@Schleichardt 我曾经考虑过这个问题,但我认为配置目录不会自动编译,这是必要的,以便迁移脚本可以用Scala或Java编写。谢谢。 - Jon
1个回答

0
  val main = play.Project(appName, appVersion, appDependencies).settings(
    scalaVersion := "2.10.3",
    scalacOptions ++= Seq("-feature"),   // enable feature warnings
    unmanagedResourceDirectories in Compile <+= scalaSource in Compile,
    excludeFilter in unmanagedResources in Compile := "*.scala" || "*.java"
  )

您可以轻松地通过以下方式检查类文件夹中的内容:

 sbt clean full-classpath && ls target/scala-2.10/classes/db/migration/

谢谢!这几乎完全符合我的需求。我需要将 ".DS_Store" 添加到排除列表中,因此完整的行看起来像:excludeFilter in unmanagedResources in Compile := "*.scala" || "*.java" || ".DS_Store" - Jon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接