Generating static assets from SBT Web
我有一个基于 SBT-Web 和 Play Framework 的项目。好吧,Play 仅用于开发,然后(在 SBT/Activator 中运行
我目前的方法是添加一个资源生成器:
1 2 3 4 5 6 7 8 |
现在可以,但它有一些缺点:
- 首先,我不能使用子目录。当我尝试将文件放入子目录时,它被放入根目录。
- 当我更改模板或源数据时,我必须重新加载项目以使其生效。
- 最后,我会稍微感谢使用 Twirl 或类似的东西。
如何克服这些缺点? (第一个是最重要的。解决其他缺点是一个较小的好处。)
- 我试图将生成代码放到管道阶段。这在构建最终工件时有效,但在开发期间不起作用。
- 想法:使用 Twirl 模板,在开发过程中动态调用它,并在管道阶段以某种方式调用它(使用一些 ClassLoader 和反射 API)。我不确定这是否是正确的方法。我是否保证在执行 sbt-web 管道阶段时已经编译了 Scala/Twirl 代码?
- 一个 hacky 想法:生成文件到项目根目录,在开发模式下通过路由动态服务它们,在管道阶段重命名它们。这是一个沉重的黑客攻击,但理论上它应该可以工作。
嗯,找到了主要问题的解决方案:
在 Play 中通过 "activator run" 运行时获取要编译的资产
仍然没有解决其他问题,所以欢迎其他答案。
对于遇到此问题的任何人,这里是来自@v6ak 提到的链接的解决方案的重要部分:
为了防止文件总是放在公共根目录中,即使它们放在子目录中,您还必须将任务输出的目录添加到
1 2 3 4 5 6 7 8 9 10 11 12 | val taskOutputDir = settingKey[File]("Resource directory for task output") taskOutputDir := (resourceManaged in Assets).value /"my-task" // ADD THIS to preserve directory structure resourceDirectories in Assets += taskOutputDir.value resourceGenerators in Assets += Def.task { // Generate your assets and output them to 'taskOutputDir' // return a Seq[File] of the generated files }.taskValue |