Chi*_*kei 7 scala sbt npm bower gulp
我有两个独立的git repos,一个包含一个用sbt构建的scala服务器,另一个包含一个用npm/bower/gulp构建的webapp前端.
在服务器repo中,我已经有了构建独立jar的任务(不是标准的包任务); 在frontend repo中,我可以构建npm install && npm run build一个独立的目录_public.
现在我想_public在sbt构建jar任务期间包含UI目录,我想知道除了在sbt中手动生成外部进程以调用npm之外还有更好的方法吗?
sbt-web 和依赖它的 webjars 目前的状态是它们很难跟上 Node.js 和 npm 的增长。例如,该sbt-hbs插件不再维护,而且我的经验表明它不适用于任何 Node.js 版本 8 或更高版本。其中一些基于 webjar 的前端工具对 sbt 1.0 的支持也不完整。因此,与问题所暗示的不同,通过 sbt 直接生成 npm 进程来构建前端是比许多解决方案更好的解决方案。
来自另一个问题的答案提供了一种从 sbt 调用 npm 的足够可靠的方法,为了完整起见,我将仅在此处复制该方法。
buildFrontend := {
val s: TaskStreams = streams.value
val shell: Seq[String] = if (sys.props("os.name").contains("Windows")) Seq("cmd", "/c") else Seq("bash", "-c")
val npmInstall: Seq[String] = shell :+ "npm install"
val npmTest: Seq[String] = shell :+ "npm run test"
val npmLint: Seq[String] = shell :+ "npm run lint"
val npmBuild: Seq[String] = shell :+ "npm run build"
s.log.info("building frontend...")
if((npmInstall #&& npmTest #&& npmLint #&& npmBuild !) == 0) {
s.log.success("frontend build successful!")
} else {
throw new IllegalStateException("frontend build failed!")
}
}
Run Code Online (Sandbox Code Playgroud)
如果您的前端使用 NPM 和 Gulp 来构建应用程序,则需要使用 NodeJS 引擎来运行它(或者也许像 Rhino 或 Nashorn 这样的 JVM 引擎可以做到这一点?不确定),并且它需要一个外部进程。
要问自己的问题是:您真的想将后端的部署与前端的部署结合起来吗?是否存在您只想部署其中一个而不部署另一个的情况?
我认为使用 SBT 部署前端很好,但如果您的前端很复杂,您宁愿将其与 SBT 分开。
您的 JS 应用不一定需要作为 Play 公共资产提供,您只需将其部署到自己的位置并在 Play HTML 模板中引用它即可。