diff options
author | Jean Helou <jhe@codamens.fr> | 2019-03-02 21:44:50 +0100 |
---|---|---|
committer | Tobias Roeser <le.petit.fou@web.de> | 2019-03-11 07:41:03 +0100 |
commit | 3387177b04bea45784685cf6a6bd9cb13cf753da (patch) | |
tree | 9eae0521b5780ea0ae7e60a034ff8563a6470013 | |
parent | c448bd3ef72d06da8ae079058e27f45d5d1be147 (diff) | |
download | mill-3387177b04bea45784685cf6a6bd9cb13cf753da.tar.gz mill-3387177b04bea45784685cf6a6bd9cb13cf753da.tar.bz2 mill-3387177b04bea45784685cf6a6bd9cb13cf753da.zip |
Extracts static asset and webjar handling to a specific trait
3 files changed, 101 insertions, 103 deletions
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") ) |