【问题标题】:How to exclude directory from source in an SBT Play Framework 2.3 project如何在 SBT Play Framework 2.3 项目中从源代码中排除目录
【发布时间】:2015-05-12 03:45:20
【问题描述】:

我有多个 Play Framework 2.3.8 项目,它们共享一组通用模型和来自不同存储库的其他库文件。这个其他“共享”存储库在开发期间被符号链接到每个项目的 app 目录中,并在部署之前复制到那里。

我希望在共享存储库中包含与这组共享库相关联的所有单元测试,以便无论在哪个项目中编译它们都可以执行它们。但是,因为这些文件都被埋在app目录,在build.sbt中默认定义为sources,项目不会编译,因为包是从test目录的角度定义的。

结构大致是这样的:

app/
  controllers/
  shared -> ../../shared
test/
  shared -> ../app/shared/test

有没有办法在我的 build.sbt 中告诉它忽略 app/shared 内的 test 目录?或者,如果有人对如何构建它有更好的建议,欢迎提出任何想法。谢谢!

【问题讨论】:

  • 我觉得我很接近:excludeFilter in unmanagedSources := "*Test.java" 但现在我得到了:[error] (compile:compile) java.util.NoSuchElementException: key not found: /Users/<.....>/app/shared/test/util/TypeConverterTest.java
  • 上述错误似乎与 PostCompile 步骤有关,因为它正在编译成功,然后在 at play.PlayCommands$$anonfun$PostCompile$1$$anonfun$6.apply(PlayCommands.scala:84) 时抛出该错误

标签: java build playframework sbt playframework-2.3


【解决方案1】:

回答你的第一个问题,排除test

excludeFilter in (Compile, unmanagedSources) := {
  val testDir = ((sourceDirectory in Compile).value / "shared" / "test").getCanonicalPath
  HidderFileFilter | SimpleFileFilter(_.getCanonicalPath.startsWith(testDir))
}

要回答您的第二个问题,构建此问题的更好方法是使用项目引用:

lazy val shared = ProjectRef(file("../shared"), "shared-name")

lazy val myProject = (project in file(".")).dependsOn(shared)

在此设置中,../shared 是一个独立的构建,它有自己的 build.sbt,您可以发布等,shared-name 是名称(由该构建中项目的 name := "shared-name" 设置)。

更好的方法是将shared 项目作为根项目,将myProject(和其他依赖它的项目)作为同一构建中的子项目。

【讨论】:

  • 感谢詹姆斯的快速回复!但是,在尝试启动 activator 时,我收到一条错误消息 value | is not a member of object sbt.HiddenFileFilter,并且 Intellij 还声称无法解析 SimpleFileFilter。 (另外,我认为您在 HiddenFileFilter 中有错字)
  • 当 Play 2.0 不支持子项目时,我们开始使用此设置进行开发,但我相信它至少应该按照您建议的第一种方式进行设置...
  • 嗯,我更新为HiddenFileFilter || new SimpleFileFilter(_.getCanonicalPath.startsWith(testDir)),但是编译的时候还是报错[error] (compile:compile) java.util.NoSuchElementException: key not found: /Users/<.....>/app/shared/test/util/TypeConverterTest.java
  • @James Roper,你能帮我吗stackoverflow.com/questions/37755358/…
【解决方案2】:

我对此类问题的解决方案是定义一个“单元测试 JAR”,即类似于 junit.jar 的 JAR,您可以将其作为测试依赖项添加到您的项目中,并且它包含测试的支持代码。

要使用支持代码,您需要编写一个扩展单元测试支持代码的测试,或者启动某种在支持 JAR 中运行测试的运行器。

【讨论】:

  • 谢谢 Aaron,我可能会将其用作备用方案,以防我无法获得其他解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-11-07
  • 1970-01-01
  • 1970-01-01
  • 2014-08-15
  • 2021-03-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多