如何在根级Playframework sbt库项目中内嵌测试用Playframework sbt项目?
解决方案:根目录存放Play库代码,同时保留测试用示例项目
我完全懂你的需求——之前把库代码塞进module子目录虽然能和示例项目同级,但总觉得不够直观,想把核心库代码放在项目根目录,同时还能方便维护测试用的Play项目对吧?别担心,用sbt的多项目构建就能完美解决这个问题,我给你一步步拆解:
1. 调整项目结构
先把项目结构改成这样,清晰又合理:
- 根目录:直接放库的核心代码(
src/main/scala、src/test/scala、build.sbt这些标准文件) - 子目录:比如新建
test-play-app文件夹,里面放完整的测试用Play项目(包含它自己的src目录、conf配置文件等)
举个实际的结构例子:
play-googleauth/ ├── src/ │ ├── main/scala/com/example/googleauth/ │ └── test/scala/com/example/googleauth/ ├── test-play-app/ │ ├── src/ │ │ ├── main/scala/com/example/testapp/ │ │ └── main/resources/conf/ │ └── ...(其他Play项目文件) ├── build.sbt └── project/ └── plugins.sbt
2. 配置根目录的build.sbt
在根目录的build.sbt里定义多项目,把根项目作为核心库,子目录作为测试用Play项目:
// 核心库项目(根目录) lazy val root = (project in file(".")) .settings( name := "play-googleauth", scalaVersion := "2.13.12", // 换成你实际使用的Scala版本 libraryDependencies ++= Seq( // 你的库依赖,比如Play相关依赖 guice, "com.typesafe.play" %% "play" % "2.8.20", // 测试依赖 "org.scalatestplus.play" %% "scalatestplus-play" % "5.1.0" % Test ) ) // 测试用Play项目 lazy val testPlayApp = (project in file("test-play-app")) .enablePlugins(PlayScala) // 启用Play框架插件 .settings( name := "play-googleauth-test-app", scalaVersion := "2.13.12", // 和核心库版本保持一致,避免兼容性问题 // 直接依赖核心库,测试项目能实时使用最新的库代码 libraryDependencies += root % "compile,test" )
3. 日常开发的便捷命令
配置好之后,日常开发和测试就很顺手了:
- 运行核心库的单元测试:
sbt root/test - 启动测试用Play项目:
sbt testPlayApp/run - 一次性跑所有测试(库+测试项目):可以在
project/Commands.scala里加个命令别名,省得敲长命令:
import sbt._ import Keys._ object Commands { addCommandAlias("testAll", ";root/test;testPlayApp/test") }
之后直接敲sbt testAll就能跑完所有测试了。
4. 关键注意事项
- 版本一致性:测试项目的
scalaVersion一定要和核心库完全相同,避免出现莫名其妙的兼容性问题 - CI集成:如果你的项目用CI(比如GitHub Actions),可以把
testAll命令加到CI流程里,确保每次库变更都不会破坏测试项目的功能 - 调试便捷性:如果要在测试项目里调试库的代码,直接修改根目录的库代码,然后运行
sbt testPlayApp/compile,会自动重新编译核心库并同步到测试项目里
这个方案完全可以套用到你的另外两个库(play-git-hub、play-secret-rotation)上,每个库都用根目录放核心代码,子目录放测试用Play项目,既直观又能满足测试需求。
内容的提问来源于stack exchange,提问作者Roberto Tyley
相关产品推荐
相关产品推荐

