sbt 项目继承并扩展了 Maven 的默认项目布局, 加入了 Scala 代码的支持, 所以目录如 Shell 命令 mkdir -p src/{main,test}/{java,scala,resources}
生成的目录结构, 即
.
└── src
├── main
│ ├── java
│ ├── resources
│ └── scala
└── test
├── java
├── resources
└── scala
这个目录目录虽然很清晰, 但把 Java 和 Scala 代码拆在两处没多大必要, 其次是层次多了点. 因使用 Play Framework 时日有点久了, 比较习惯于 Play 2 改造后的项目布局. 我们启动到 Play 2 的 activator(其实就是加入了定制的 sbt) 控制台, 用命令看它的目录布局
[Test Play 2] $ show javaSource test:javaSource scalaSource test:scalaSource resourceDirectory test:resourceDirectory
[info] compile:javaSource
[info] /Users/yanbin/Workspaces/test_play_2/app
[info] test:javaSource
[info] /Users/yanbin/Workspaces/test_play_2/test
[info] compile:scalaSource
[info] /Users/yanbin/Workspaces/test_play_2/app
[info] test:scalaSource
[info] /Users/yanbin/Workspaces/test_play_2/test
[info] compile:resourceDirectory
[info] /Users/yanbin/Workspaces/test_play_2/conf
[info] test:resourceDirectory
[info] /Users/yanbin/Workspaces/test_play_2/test/resources
理清一下的话, 它的目录布局就是 mkdir -p app conf test/resources
生成的结构
.
├── app
├── conf
└── test
└── resources
是不是清爽了许多呢? 其实我们项目到现在都还没有使用到 test/resources 目录, 所以只要一个平面的目录结构, 即 app(Java 和 Scala 产品代码), conf(配置文件), 和 test(测试代码, 无论 Java 或 Scala) 目录.
Play 2 实现上面的布局是由 PlayLayoutPlugin.scala 插件代码来定义的. 那自己的 sbt 项目如何定义这样的目录结构呢, 照抄吗. 只要在自己的 build.sbt
文件里写上
1 2 3 4 5 6 7 8 9 10 11 |
sourceDirectory in Compile := baseDirectory.value / "app" sourceDirectory in Test := baseDirectory.value / "test" resourceDirectory in Compile := baseDirectory.value / "conf" resourceDirectory in Test := (sourceDirectory in Test).value / "resource" scalaSource in Compile := baseDirectory.value / "app" scalaSource in Test := baseDirectory.value / "test" javaSource in Compile := baseDirectory.value / "app" javaSource in Test := baseDirectory.value / "test" |
第四行("resource" 行) 没在 PlayLayoutPlugin.scala 中定义, 我自己加上去的, 如果用不上就不要它. 然后进入 sbt 控制台, 用 show javaSource test:javaSource scalaSource test:scalaSource resourceDirectory test:resourceDirectory
看下输出应该就是我们想要的目录布局.
如果去掉前两行一般来说也说得过去, 但用 show sourceDirectory compile:sourceDirectory test:sourceDiretory
显示的分别是 src, src/main 和 src/test 目录. 所以严谨点定义还需像上面八行那样定义布局. 我也可以把它做成一个插件放在 github 上去的.
本文链接 https://yanbin.blog/layout-like-playframework-2/, 来自 隔叶黄莺 Yanbin Blog
[版权声明] 本文采用 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 进行许可。