From cb98adf72b4a4487e8d5d39425f8ded4116ec854 Mon Sep 17 00:00:00 2001 From: "Taro L. Saito" Date: Thu, 11 Jan 2018 23:51:50 -0800 Subject: [PATCH 1/2] #132: Handle the context project appropriately --- .../scala/xerial/sbt/pack/PackPlugin.scala | 52 ++++++++++--------- .../sbt-pack/nested-project/build.sbt | 16 ++++++ .../libs/lib1/src/main/scala/lib1/Lib1.scala | 5 ++ .../libs/lib2/src/main/scala/lib2/Lib2.scala | 5 ++ .../module1/src/main/scala/service/Main.scala | 9 ++++ .../module2/src/main/scala/service/Main.scala | 9 ++++ .../nested-project/project/plugins.sbt | 1 + src/sbt-test/sbt-pack/nested-project/test | 16 ++++++ 8 files changed, 88 insertions(+), 25 deletions(-) create mode 100644 src/sbt-test/sbt-pack/nested-project/build.sbt create mode 100644 src/sbt-test/sbt-pack/nested-project/libs/lib1/src/main/scala/lib1/Lib1.scala create mode 100644 src/sbt-test/sbt-pack/nested-project/libs/lib2/src/main/scala/lib2/Lib2.scala create mode 100644 src/sbt-test/sbt-pack/nested-project/modules/module1/src/main/scala/service/Main.scala create mode 100644 src/sbt-test/sbt-pack/nested-project/modules/module2/src/main/scala/service/Main.scala create mode 100644 src/sbt-test/sbt-pack/nested-project/project/plugins.sbt create mode 100644 src/sbt-test/sbt-pack/nested-project/test diff --git a/src/main/scala/xerial/sbt/pack/PackPlugin.scala b/src/main/scala/xerial/sbt/pack/PackPlugin.scala index 86d43be5..05672090 100755 --- a/src/main/scala/xerial/sbt/pack/PackPlugin.scala +++ b/src/main/scala/xerial/sbt/pack/PackPlugin.scala @@ -124,15 +124,15 @@ object PackPlugin extends AutoPlugin with PackArchive { packGenerateWindowsBatFile := true, packGenerateMakefile := true, packMainDiscovered := Def.taskDyn { - val mainClasses = getFromSelectedProjects(discoveredMainClasses in Compile, state.value, packExclude.value) + val mainClasses = getFromSelectedProjects(thisProjectRef.value, discoveredMainClasses in Compile, state.value, packExclude.value) Def.task { mainClasses.value.flatMap(_._1.map(mainClass => hyphenize(mainClass.split('.').last) -> mainClass).toMap).toMap } }.value, packAllUnmanagedJars := Def.taskDyn { - val allUnmanagedJars = getFromSelectedProjects(unmanagedJars in Runtime, state.value, packExclude.value) + val allUnmanagedJars = getFromSelectedProjects(thisProjectRef.value, unmanagedJars in Runtime, state.value, packExclude.value) Def.task { allUnmanagedJars.value } }.value, packLibJars := Def.taskDyn { - val libJars = getFromSelectedProjects(packageBin in Runtime, state.value, packExcludeLibJars.value) + val libJars = getFromSelectedProjects(thisProjectRef.value, packageBin in Runtime, state.value, packExcludeLibJars.value) Def.task { libJars.value } }.value, (mappings in pack) := Seq.empty, @@ -208,9 +208,9 @@ object PackPlugin extends AutoPlugin with PackArchive { }, pack := { val out = streams.value - + val logPrefix = "[" + name.value + "] " val distDir: File = packTargetDir.value / packDir.value - out.log.info("Creating a distributable package in " + rpath(baseDirectory.value, distDir)) + out.log.info(logPrefix + "Creating a distributable package in " + rpath(baseDirectory.value, distDir)) IO.delete(distDir) distDir.mkdirs() @@ -220,15 +220,15 @@ object PackPlugin extends AutoPlugin with PackArchive { // Copy project jars val base: File = new File(".") // Using the working directory as base for readability - out.log.info("Copying libraries to " + rpath(base, libDir)) + out.log.info(logPrefix + "Copying libraries to " + rpath(base, libDir)) val libs: Seq[File] = packLibJars.value.map(_._1) - out.log.info("project jars:\n" + libs.map(path => rpath(base, path)).mkString("\n")) + out.log.info(logPrefix + "project jars:\n" + libs.map(path => rpath(base, path)).mkString("\n")) libs.foreach(l => IO.copyFile(l, libDir / l.getName)) // Copy dependent jars val distinctDpJars = packModuleEntries.value - out.log.info("project dependencies:\n" + distinctDpJars.mkString("\n")) + out.log.info(logPrefix + "project dependencies:\n" + distinctDpJars.mkString("\n")) val jarNameConvention = packJarNameConvention.value for (m <- distinctDpJars) { val targetFileName = resolveJarName(m, jarNameConvention) @@ -236,7 +236,7 @@ object PackPlugin extends AutoPlugin with PackArchive { } // Copy unmanaged jars in ${baseDir}/lib folder - out.log.info("unmanaged dependencies:") + out.log.info(logPrefix + "unmanaged dependencies:") for ((m, projectRef) <- packAllUnmanagedJars.value; um <- m; f = um.data) { out.log.info(f.getPath) IO.copyFile(f, libDir / f.getName, true) @@ -244,7 +244,7 @@ object PackPlugin extends AutoPlugin with PackArchive { // Copy explicitly added dependencies val mapped: Seq[(File, String)] = (mappings in pack).value - out.log.info("explicit dependencies:") + out.log.info(logPrefix + "explicit dependencies:") for ((file, path) <- mapped) { out.log.info(file.getPath) IO.copyFile(file, distDir / path, true) @@ -252,20 +252,20 @@ object PackPlugin extends AutoPlugin with PackArchive { // Create target/pack/bin folder val binDir = distDir / "bin" - out.log.info("Create a bin folder: " + rpath(base, binDir)) + out.log.info(logPrefix + "Create a bin folder: " + rpath(base, binDir)) binDir.mkdirs() def write(path: String, content: String) { val p = distDir / path - out.log.info("Generating %s".format(rpath(base, p))) + out.log.info(logPrefix + "Generating %s".format(rpath(base, p))) IO.write(p, content) } // Create launch scripts - out.log.info("Generating launch scripts") + out.log.info(logPrefix + "Generating launch scripts") val mainTable: Map[String, String] = packMain.value if (mainTable.isEmpty) { - out.log.warn("No mapping (program name) -> MainClass is defined. Please set packMain variable (Map[String, String]) in your sbt project settings.") + out.log.warn(logPrefix + "No mapping (program name) -> MainClass is defined. Please set packMain variable (Map[String, String]) in your sbt project settings.") } val progVersion = version.value @@ -273,7 +273,7 @@ object PackPlugin extends AutoPlugin with PackArchive { // Check the current Git revision val gitRevision: String = Try { - out.log.info("Checking the git revison of the current project") + out.log.info(logPrefix + "Checking the git revision of the current project") sys.process.Process("git rev-parse HEAD").!! }.getOrElse("unknown").trim @@ -282,7 +282,7 @@ object PackPlugin extends AutoPlugin with PackArchive { // Render script via Scalate template for ((name, mainClass) <- mainTable) { - out.log.info("main class for %s: %s".format(name, mainClass)) + out.log.info(logPrefix + "main class for %s: %s".format(name, mainClass)) def extraClasspath(sep: String): String = packExtraClasspath.value.get(name).map(_.mkString("", sep, sep)).getOrElse("") def expandedClasspath(sep: String): String = { val projJars = libs.map(l => "${PROG_HOME}/lib/" + l.getName) @@ -344,7 +344,7 @@ object PackPlugin extends AutoPlugin with PackArchive { // Copy resources val otherResourceDirs = packResourceDir.value val binScriptsDir = otherResourceDirs.map(_._1 / "bin").filter(_.exists) - out.log.info(s"packed resource directories = ${otherResourceDirs.map(_._1).mkString(",")}") + out.log.info(logPrefix + s"packed resource directories = ${otherResourceDirs.map(_._1).mkString(",")}") def linkToScript(name: String) = "\t" + """ln -sf "../$(PROG)/current/bin/%s" "$(PREFIX)/bin/%s"""".format(name, name) @@ -382,7 +382,7 @@ object PackPlugin extends AutoPlugin with PackArchive { // chmod +x the scripts in bin directory binDir.listFiles.foreach(_.setExecutable(true, false)) - out.log.info("done.") + out.log.info(logPrefix + "done.") distDir }, packInstall := { @@ -398,12 +398,10 @@ object PackPlugin extends AutoPlugin with PackArchive { } ) - //private def getFromAllProjects[T](targetTask: taskKey[T])(currentProject: ProjectRef, structure: BuildStructure): Task[Seq[(T, ProjectRef)]] = - private def getFromAllProjects[T](targetTask: TaskKey[T], state: State): Task[Seq[(T, ProjectRef)]] = - getFromSelectedProjects(targetTask, state, Seq.empty) + private def getFromAllProjects[T](contextProject:ProjectRef, targetTask: TaskKey[T], state: State): Task[Seq[(T, ProjectRef)]] = + getFromSelectedProjects(contextProject, targetTask, state, Seq.empty) - //private def getFromSelectedProjects[T](targetTask: TaskKey[T])(currentProject: ProjectRef, structure: BuildStructure, exclude: Seq[String]): Task[Seq[(T, ProjectRef)]] = { - private def getFromSelectedProjects[T](targetTask: TaskKey[T], state: State, exclude: Seq[String]): Task[Seq[(T, ProjectRef)]] = { + private def getFromSelectedProjects[T](contextProject:ProjectRef, targetTask: TaskKey[T], state: State, exclude: Seq[String]): Task[Seq[(T, ProjectRef)]] = { val extracted = Project.extract(state) val structure = extracted.structure @@ -411,10 +409,14 @@ object PackPlugin extends AutoPlugin with PackArchive { def isExcluded(p: ProjectRef) = exclude.contains(p.project) // Traverse all dependent projects - val children = Project.getProject(currentProject, structure).toSeq.flatMap(_.dependencies.map(_.project)) + val children = Project + .getProject(currentProject, structure) + .toSeq + .flatMap{ _.dependencies.map(_.project) } + (currentProject +: (children flatMap (transitiveDependencies(_)))) filterNot (isExcluded) } - val projects: Seq[ProjectRef] = transitiveDependencies(extracted.currentRef).distinct + val projects: Seq[ProjectRef] = transitiveDependencies(contextProject).distinct projects.map(p => (Def.task { ((targetTask in p).value, p) }) evaluate structure.data).join } diff --git a/src/sbt-test/sbt-pack/nested-project/build.sbt b/src/sbt-test/sbt-pack/nested-project/build.sbt new file mode 100644 index 00000000..7d844cbb --- /dev/null +++ b/src/sbt-test/sbt-pack/nested-project/build.sbt @@ -0,0 +1,16 @@ +name := "nested" + +version in ThisBuild := "0.1" + +scalaVersion := "2.12.4" + +enablePlugins(PackPlugin) + +lazy val root = (project in file(".")) + .dependsOn(module1, module2) + +lazy val module1 = (project in file("modules/module1")).dependsOn(lib1) +lazy val module2 = (project in file("modules/module2")).dependsOn(lib2) + +lazy val lib1 = project in file("libs/lib1") +lazy val lib2 = project in file("libs/lib2") diff --git a/src/sbt-test/sbt-pack/nested-project/libs/lib1/src/main/scala/lib1/Lib1.scala b/src/sbt-test/sbt-pack/nested-project/libs/lib1/src/main/scala/lib1/Lib1.scala new file mode 100644 index 00000000..6f4ba308 --- /dev/null +++ b/src/sbt-test/sbt-pack/nested-project/libs/lib1/src/main/scala/lib1/Lib1.scala @@ -0,0 +1,5 @@ +package lib1 + +object Lib1 { + val value = 1 +} diff --git a/src/sbt-test/sbt-pack/nested-project/libs/lib2/src/main/scala/lib2/Lib2.scala b/src/sbt-test/sbt-pack/nested-project/libs/lib2/src/main/scala/lib2/Lib2.scala new file mode 100644 index 00000000..49b3055e --- /dev/null +++ b/src/sbt-test/sbt-pack/nested-project/libs/lib2/src/main/scala/lib2/Lib2.scala @@ -0,0 +1,5 @@ +package lib2 + +object Lib2 { + val value = 2 +} diff --git a/src/sbt-test/sbt-pack/nested-project/modules/module1/src/main/scala/service/Main.scala b/src/sbt-test/sbt-pack/nested-project/modules/module1/src/main/scala/service/Main.scala new file mode 100644 index 00000000..6d49505c --- /dev/null +++ b/src/sbt-test/sbt-pack/nested-project/modules/module1/src/main/scala/service/Main.scala @@ -0,0 +1,9 @@ +package service + +import lib1.Lib1 + +object Main { + def main(args: Array[String]): Unit = { + println(Lib1.value) + } +} diff --git a/src/sbt-test/sbt-pack/nested-project/modules/module2/src/main/scala/service/Main.scala b/src/sbt-test/sbt-pack/nested-project/modules/module2/src/main/scala/service/Main.scala new file mode 100644 index 00000000..1fc1b6ac --- /dev/null +++ b/src/sbt-test/sbt-pack/nested-project/modules/module2/src/main/scala/service/Main.scala @@ -0,0 +1,9 @@ +package service + +import lib2.Lib2 + +object Main { + def main(args: Array[String]): Unit = { + println(Lib2.value) + } +} diff --git a/src/sbt-test/sbt-pack/nested-project/project/plugins.sbt b/src/sbt-test/sbt-pack/nested-project/project/plugins.sbt new file mode 100644 index 00000000..48d083b6 --- /dev/null +++ b/src/sbt-test/sbt-pack/nested-project/project/plugins.sbt @@ -0,0 +1 @@ +addSbtPlugin("org.xerial.sbt" % "sbt-pack" % "0.10.1-SNAPSHOT") diff --git a/src/sbt-test/sbt-pack/nested-project/test b/src/sbt-test/sbt-pack/nested-project/test new file mode 100644 index 00000000..f59ac8ee --- /dev/null +++ b/src/sbt-test/sbt-pack/nested-project/test @@ -0,0 +1,16 @@ +> 'set version := "0.1"' +> pack +$ exists target/pack/lib/module1_2.12-0.1.jar +$ exists target/pack/lib/module2_2.12-0.1.jar +$ exists target/pack/lib/lib1_2.12-0.1.jar +$ exists target/pack/lib/lib2_2.12-0.1.jar +$ absent modules/module1/target/pack/lib/module1_2.12-0.1.jar +$ absent modules/module1/target/pack/lib/module2_2.12-0.1.jar +$ absent modules/module1/target/pack/lib/lib1_2.12-0.1.jar +$ absent modules/module1/target/pack/lib/lib2_2.12-0.1.jar + +> module1/pack +$ exists modules/module1/target/pack/lib/module1_2.12-0.1.jar +$ absent modules/module1/target/pack/lib/module2_2.12-0.1.jar +$ exists modules/module1/target/pack/lib/lib1_2.12-0.1.jar +$ absent modules/module1/target/pack/lib/lib2_2.12-0.1.jar From 197c98cfab635c90bc424ee7c832035472487c75 Mon Sep 17 00:00:00 2001 From: "Taro L. Saito" Date: Fri, 12 Jan 2018 10:33:35 -0800 Subject: [PATCH 2/2] Fix tests for new behavior --- src/main/scala/xerial/sbt/pack/PackPlugin.scala | 14 ++++++++++---- src/sbt-test/sbt-pack/archive-modules/test | 11 ++++++++--- src/sbt-test/sbt-pack/duplicate-jars/build.sbt | 2 +- src/sbt-test/sbt-pack/duplicate-jars/test | 4 ++-- src/sbt-test/sbt-pack/nested-project/build.sbt | 2 +- 5 files changed, 22 insertions(+), 11 deletions(-) diff --git a/src/main/scala/xerial/sbt/pack/PackPlugin.scala b/src/main/scala/xerial/sbt/pack/PackPlugin.scala index 05672090..385a5100 100755 --- a/src/main/scala/xerial/sbt/pack/PackPlugin.scala +++ b/src/main/scala/xerial/sbt/pack/PackPlugin.scala @@ -209,8 +209,10 @@ object PackPlugin extends AutoPlugin with PackArchive { pack := { val out = streams.value val logPrefix = "[" + name.value + "] " + val base: File = new File(".") // Using the working directory as base for readability + val distDir: File = packTargetDir.value / packDir.value - out.log.info(logPrefix + "Creating a distributable package in " + rpath(baseDirectory.value, distDir)) + out.log.info(logPrefix + "Creating a distributable package in " + rpath(base, distDir)) IO.delete(distDir) distDir.mkdirs() @@ -219,7 +221,6 @@ object PackPlugin extends AutoPlugin with PackArchive { libDir.mkdirs() // Copy project jars - val base: File = new File(".") // Using the working directory as base for readability out.log.info(logPrefix + "Copying libraries to " + rpath(base, libDir)) val libs: Seq[File] = packLibJars.value.map(_._1) out.log.info(logPrefix + "project jars:\n" + libs.map(path => rpath(base, path)).mkString("\n")) @@ -273,8 +274,13 @@ object PackPlugin extends AutoPlugin with PackArchive { // Check the current Git revision val gitRevision: String = Try { - out.log.info(logPrefix + "Checking the git revision of the current project") - sys.process.Process("git rev-parse HEAD").!! + if((base / ".git").exists()) { + out.log.info(logPrefix + "Checking the git revision of the current project") + sys.process.Process("git rev-parse HEAD").!! + } + else { + "unknown" + } }.getOrElse("unknown").trim val pathSeparator = "${PSEP}" diff --git a/src/sbt-test/sbt-pack/archive-modules/test b/src/sbt-test/sbt-pack/archive-modules/test index 7bc5f75b..3349d45e 100644 --- a/src/sbt-test/sbt-pack/archive-modules/test +++ b/src/sbt-test/sbt-pack/archive-modules/test @@ -3,15 +3,20 @@ $ exists target/archive-modules-0.1.tar.gz $ exists target/archive-modules-0.1.zip $ exists target/pack/bin/module1 -$ exec sh ./target/pack/bin/module1 $ absent target/pack/bin/module2 +$ exists target/pack/lib/xerial-core-3.3.6.jar +$ absent target/pack/lib/snappy-java-1.1.1.6.jar + +$ exec sh ./target/pack/bin/module1 $ exists module2/target/module2-0.1.tar.gz $ exists module2/target/module2-0.1.zip -$ absent module2/target/pack/bin/module2 -$ absent target/pack/lib/snappy-java-1.1.1.6.jar +$ exists module2/target/pack/bin/module2 +$ exists module2/target/pack/lib/snappy-java-1.1.1.6.jar + $ exists module1/target/module1-0.1.tar.gz $ exists module1/target/module1-0.1.zip $ exists module1/target/pack/bin/module1 +$ exists module1/target/pack/lib/xerial-core-3.3.6.jar $ exec sh ./module1/target/pack/bin/module1 > 'set packArchiveName := "my-archive"' > packArchiveTgz diff --git a/src/sbt-test/sbt-pack/duplicate-jars/build.sbt b/src/sbt-test/sbt-pack/duplicate-jars/build.sbt index 3f1ba579..fcf01b6c 100644 --- a/src/sbt-test/sbt-pack/duplicate-jars/build.sbt +++ b/src/sbt-test/sbt-pack/duplicate-jars/build.sbt @@ -1,5 +1,5 @@ +scalaVersion in ThisBuild := "2.12.4" val commonSettings = Defaults.coreDefaultSettings ++ Seq( - scalaVersion := "2.11.8", version := "0.1", crossPaths := false ) diff --git a/src/sbt-test/sbt-pack/duplicate-jars/test b/src/sbt-test/sbt-pack/duplicate-jars/test index 9401148f..bfa468c7 100644 --- a/src/sbt-test/sbt-pack/duplicate-jars/test +++ b/src/sbt-test/sbt-pack/duplicate-jars/test @@ -1,5 +1,5 @@ > 'set version := "0.1"' > pack -$ exists target/pack/lib/scala-library-2.11.8.jar +$ exists target/pack/lib/scala-library-2.12.4.jar $ absent target/pack/lib/slf4j-api-1.7.2.jar -$ exists target/pack/lib/slf4j-api-1.7.6.jar \ No newline at end of file +$ exists target/pack/lib/slf4j-api-1.7.6.jar diff --git a/src/sbt-test/sbt-pack/nested-project/build.sbt b/src/sbt-test/sbt-pack/nested-project/build.sbt index 7d844cbb..4fc443ac 100644 --- a/src/sbt-test/sbt-pack/nested-project/build.sbt +++ b/src/sbt-test/sbt-pack/nested-project/build.sbt @@ -2,7 +2,7 @@ name := "nested" version in ThisBuild := "0.1" -scalaVersion := "2.12.4" +scalaVersion in ThisBuild := "2.12.4" enablePlugins(PackPlugin)