From 3387177b04bea45784685cf6a6bd9cb13cf753da Mon Sep 17 00:00:00 2001 From: Jean Helou Date: Sat, 2 Mar 2019 21:44:50 +0100 Subject: Extracts static asset and webjar handling to a specific trait --- contrib/playlib/src/mill/playlib/PlayModule.scala | 103 +-------------------- contrib/playlib/src/mill/playlib/Static.scala | 99 ++++++++++++++++++++ .../mill/playlib/PlaySingleApiModuleTests.scala | 2 +- 3 files changed, 101 insertions(+), 103 deletions(-) create mode 100644 contrib/playlib/src/mill/playlib/Static.scala (limited to 'contrib') diff --git a/contrib/playlib/src/mill/playlib/PlayModule.scala b/contrib/playlib/src/mill/playlib/PlayModule.scala index 563bbd1c..10b6d40d 100644 --- a/contrib/playlib/src/mill/playlib/PlayModule.scala +++ b/contrib/playlib/src/mill/playlib/PlayModule.scala @@ -1,19 +1,7 @@ package mill package playlib -import java.net.URI -import java.nio.file.FileSystems -import java.nio.file.FileVisitOption -import java.nio.file.FileVisitResult -import java.nio.file.Files -import java.nio.file.Path -import java.nio.file.SimpleFileVisitor -import java.nio.file.attribute.BasicFileAttributes -import java.util - -import mill.PathRef import mill.scalalib._ -import scala.collection.JavaConverters._ import api.Versions @@ -31,96 +19,7 @@ trait PlayApiModule extends Dependencies with Router with Server{ override def sources = T.sources{ millSourcePath } } - /** - * project resources including configuration, webjars and static assets - */ - def resources = T.sources { - super.resources() :+ webJarResources() :+ staticAssets() - } - - /** - * Resource base path of packaged assets (path they will appear in in the jar) - */ - def assetsPath = T{ "public" } - - /** - * Directories to include assets from - */ - def assetSources = T.sources{ millSourcePath / 'public } - - /* - Collected static assets for the project - */ - def staticAssets = T { - val toPath = os.Path(assetsPath(), T.ctx().dest) - assetSources().foreach{ pathRef => - val fromPath = pathRef.path - if (os.isDir(fromPath)) { - os.walk(fromPath).filter(os.isFile(_)).foreach{ p => - os.copy(p, toPath / p.relativeTo(fromPath), createFolders = true) - } - } - } - PathRef(T.ctx().dest) - } - - /** - * webjar dependencies - created from transitive ivy deps - */ - def webJarDeps = T{ - transitiveIvyDeps().filter(_.dep.module.organization == "org.webjars") - } - - /** - * jar files of web jars - */ - def webJars = T{ - Lib.resolveDependencies(repositories, Lib.depToDependency(_, scalaVersion()), webJarDeps()) - } - - /** - * webjar resources extracted from their source jars with version from path removed - */ - def webJarResources = T { - extractWebJars(webJars().toSeq, os.Path(assetsPath(), T.ctx().dest) / 'lib) - PathRef(T.ctx().dest) - } - - def start(args: String*) = T.command{ run(args:_*) } - - def extractWebJars(jars: Seq[PathRef], webJarBase: os.Path): Unit = { - val prefix = "/META-INF/resources/webjars/" - - jars.foreach{ jarRef => - val uri = s"jar:file:${jarRef.path}" - val env = Map.empty[String,String].asJava - - val zipFs = FileSystems.newFileSystem(URI.create(uri), env) - try { - for(root <- zipFs.getRootDirectories.asScala) { - Files.walkFileTree(root, util.EnumSet.noneOf(classOf[FileVisitOption]), Int.MaxValue, - new SimpleFileVisitor[Path] { - override def visitFile(file: Path, attrs: BasicFileAttributes) = { - if (file.startsWith(prefix)) { - val rel = os.RelPath(file.toString.substring(prefix.length)) - val toFile = webJarBase / os.RelPath(rel.segments(0) +: rel.segments.drop(2), 0) - //println(s"$file -> $toFile") - os.makeDir.all(toFile / os.up) - Files.copy(file, toFile.toNIO) - } - FileVisitResult.CONTINUE - } - } - ) - } - } - finally { - zipFs.close() - } - } - } - } -trait PlayModule extends PlayApiModule with Twirl +trait PlayModule extends PlayApiModule with Static with Twirl diff --git a/contrib/playlib/src/mill/playlib/Static.scala b/contrib/playlib/src/mill/playlib/Static.scala new file mode 100644 index 00000000..e6cd7779 --- /dev/null +++ b/contrib/playlib/src/mill/playlib/Static.scala @@ -0,0 +1,99 @@ +package mill.playlib + +import java.net.URI +import java.nio.file._ +import java.nio.file.attribute.BasicFileAttributes +import java.util + +import mill.{PathRef, T} +import mill.scalalib.{Lib, ScalaModule} + +trait Static extends ScalaModule { + /** + * project resources including configuration, webjars and static assets + */ + override def resources = T.sources { + super.resources() :+ webJarResources() :+ staticAssets() + } + + /** + * Resource base path of packaged assets (path they will appear in in the jar) + */ + def assetsPath = T{ "public" } + + /** + * Directories to include assets from + */ + def assetSources = T.sources{ millSourcePath / assetsPath() } + + /* + Collected static assets for the project + */ + def staticAssets = T { + val toPath = os.Path(assetsPath(), T.ctx().dest) + assetSources().foreach{ pathRef => + val fromPath = pathRef.path + if (os.isDir(fromPath)) { + os.walk(fromPath).filter(os.isFile(_)).foreach{ p => + os.copy(p, toPath / p.relativeTo(fromPath), createFolders = true) + } + } + } + PathRef(T.ctx().dest) + } + + /** + * webjar dependencies - created from transitive ivy deps + */ + def webJarDeps = T{ + transitiveIvyDeps().filter(_.dep.module.organization == "org.webjars") + } + + /** + * jar files of web jars + */ + def webJars = T{ + Lib.resolveDependencies(repositories, Lib.depToDependency(_, scalaVersion()), webJarDeps()) + } + + /** + * webjar resources extracted from their source jars with version from path removed + */ + def webJarResources = T { + extractWebJars(webJars().toSeq, os.Path(assetsPath(), T.ctx().dest) / 'lib) + PathRef(T.ctx().dest) + } + + private def extractWebJars(jars: Seq[PathRef], webJarBase: os.Path): Unit = { + import scala.collection.JavaConverters._ + val prefix = "/META-INF/resources/webjars/" + + jars.foreach{ jarRef => + val uri = s"jar:file:${jarRef.path}" + val env = Map.empty[String,String].asJava + + val zipFs = FileSystems.newFileSystem(URI.create(uri), env) + try { + for(root <- zipFs.getRootDirectories.asScala) { + Files.walkFileTree(root, util.EnumSet.noneOf(classOf[FileVisitOption]), Int.MaxValue, + new SimpleFileVisitor[Path] { + override def visitFile(file: Path, attrs: BasicFileAttributes) = { + if (file.startsWith(prefix)) { + val rel = os.RelPath(file.toString.substring(prefix.length)) + val toFile = webJarBase / os.RelPath(rel.segments(0) +: rel.segments.drop(2), 0) + //println(s"$file -> $toFile") + os.makeDir.all(toFile / os.up) + Files.copy(file, toFile.toNIO) + } + FileVisitResult.CONTINUE + } + } + ) + } + } + finally { + zipFs.close() + } + } + } +} diff --git a/contrib/playlib/test/src/mill/playlib/PlaySingleApiModuleTests.scala b/contrib/playlib/test/src/mill/playlib/PlaySingleApiModuleTests.scala index 0171dbe9..df69ca83 100644 --- a/contrib/playlib/test/src/mill/playlib/PlaySingleApiModuleTests.scala +++ b/contrib/playlib/test/src/mill/playlib/PlaySingleApiModuleTests.scala @@ -50,7 +50,7 @@ object PlaySingleApiModuleTests extends TestSuite { conf.map(_.path.relativeTo(playsingleapi.millSourcePath).toString()) == Seq("conf"), app.map(_.path.relativeTo(playsingleapi.millSourcePath).toString()) == Seq("app"), sources== app, - resources.map(_.path.relativeTo(playsingleapi.millSourcePath).toString()).contains("conf"), + resources== conf, testSources.map(_.path.relativeTo(playsingleapi.millSourcePath).toString()) == Seq("test"), testResources.map(_.path.relativeTo(playsingleapi.millSourcePath).toString()) == Seq("test/resources") ) -- cgit v1.2.3