forked from softprops/assembly-sbt
-
Notifications
You must be signed in to change notification settings - Fork 223
/
AssemblyPlugin.scala
154 lines (133 loc) · 7.08 KB
/
AssemblyPlugin.scala
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
package sbtassembly
import sbt._
import Keys._
object AssemblyPlugin extends sbt.AutoPlugin {
override def requires = plugins.JvmPlugin
override def trigger = allRequirements
object autoImport extends AssemblyKeys {
val Assembly = sbtassembly.Assembly
val MergeStrategy = sbtassembly.MergeStrategy
val PathList = sbtassembly.PathList
val baseAssemblySettings = AssemblyPlugin.baseAssemblySettings
val ShadeRule = sbtassembly.ShadeRule
}
import autoImport.{ Assembly => _, baseAssemblySettings => _, _ }
val defaultShellScript: Seq[String] = defaultShellScript()
def defaultShellScript(javaOpts: Seq[String] = Seq.empty): Seq[String] = {
val javaOptsString = javaOpts.map(_ + " ").mkString
Seq("#!/usr/bin/env sh", s"""exec java -jar $javaOptsString$$JAVA_OPTS "$$0" "$$@"""", "")
}
private def universalScript(shellCommands: String,
cmdCommands: String,
shebang: Boolean): String = {
Seq(
if (shebang) "#!/usr/bin/env sh" else "",
"@ 2>/dev/null # 2>nul & echo off & goto BOF\r",
":",
shellCommands.replaceAll("\r\n|\n", "\n"),
"exit",
Seq(
"",
":BOF",
cmdCommands.replaceAll("\r\n|\n", "\r\n"),
"exit /B %errorlevel%",
""
).mkString("\r\n")
).filterNot(_.isEmpty).mkString("\n")
}
def defaultUniversalScript(javaOpts: Seq[String] = Seq.empty, shebang: Boolean = true): Seq[String] = {
val javaOptsString = javaOpts.map(_ + " ").mkString
Seq(universalScript(
shellCommands = s"""exec java -jar $javaOptsString$$JAVA_OPTS "$$0" "$$@"""",
cmdCommands = s"""java -jar $javaOptsString%JAVA_OPTS% "%~dpnx0" %*""",
shebang = shebang
))
}
override lazy val projectSettings: Seq[Def.Setting[_]] = assemblySettings
lazy val baseAssemblySettings: Seq[sbt.Def.Setting[_]] = Seq(
assembly := Assembly.assemblyTask(assembly).value,
logLevel in assembly := Level.Info,
assembledMappings in assembly := Assembly.assembledMappingsTask(assembly).value,
assemblyPackageScala := Assembly.assemblyTask(assemblyPackageScala).value,
assembledMappings in assemblyPackageScala := Assembly.assembledMappingsTask(assemblyPackageScala).value,
assemblyPackageDependency := Assembly.assemblyTask(assemblyPackageDependency).value,
assembledMappings in assemblyPackageDependency := Assembly.assembledMappingsTask(assemblyPackageDependency).value,
// test
test in assembly := (test in Test).value,
test in assemblyPackageScala := (test in assembly).value,
test in assemblyPackageDependency := (test in assembly).value,
// assemblyOption
assembleArtifact in packageBin := true,
assembleArtifact in assemblyPackageScala := true,
assembleArtifact in assemblyPackageDependency := true,
assemblyMergeStrategy in assembly := MergeStrategy.defaultMergeStrategy,
assemblyShadeRules in assembly := Seq(),
assemblyExcludedJars in assembly := Nil,
assemblyOption in assembly := {
val s = streams.value
AssemblyOption(
assemblyDirectory = s.cacheDirectory / "assembly",
includeBin = (assembleArtifact in packageBin).value,
includeScala = (assembleArtifact in assemblyPackageScala).value,
includeDependency = (assembleArtifact in assemblyPackageDependency).value,
mergeStrategy = (assemblyMergeStrategy in assembly).value,
excludedJars = (assemblyExcludedJars in assembly).value,
excludedFiles = Assembly.defaultExcludedFiles,
cacheOutput = true,
cacheUnzip = true,
appendContentHash = false,
prependShellScript = None,
maxHashLength = None,
shadeRules = (assemblyShadeRules in assembly).value,
level = (logLevel in assembly).value)
},
assemblyOption in assemblyPackageScala := {
val ao = (assemblyOption in assembly).value
ao.copy(includeBin = false, includeScala = true, includeDependency = false)
},
assemblyOption in assemblyPackageDependency := {
val ao = (assemblyOption in assembly).value
ao.copy(includeBin = false, includeScala = true, includeDependency = true)
},
// packageOptions
packageOptions in assembly := {
val os = (packageOptions in (Compile, packageBin)).value
(mainClass in assembly).value map { s =>
Package.MainClass(s) +: (os filterNot {_.isInstanceOf[Package.MainClass]})
} getOrElse {os}
},
packageOptions in assemblyPackageScala := (packageOptions in (Compile, packageBin)).value,
packageOptions in assemblyPackageDependency := (packageOptions in (Compile, packageBin)).value,
// outputPath
assemblyOutputPath in assembly := { (target in assembly).value / (assemblyJarName in assembly).value },
assemblyOutputPath in assemblyPackageScala := { (target in assembly).value / (assemblyJarName in assemblyPackageScala).value },
assemblyOutputPath in assemblyPackageDependency := { (target in assembly).value / (assemblyJarName in assemblyPackageDependency).value },
target in assembly := crossTarget.value,
assemblyJarName in assembly := ((assemblyJarName in assembly) or (assemblyDefaultJarName in assembly)).value,
assemblyJarName in assemblyPackageScala := ((assemblyJarName in assemblyPackageScala) or (assemblyDefaultJarName in assemblyPackageScala)).value,
assemblyJarName in assemblyPackageDependency := ((assemblyJarName in assemblyPackageDependency) or (assemblyDefaultJarName in assemblyPackageDependency)).value,
assemblyDefaultJarName in assemblyPackageScala := { "scala-library-" + scalaVersion.value + "-assembly.jar" },
assemblyDefaultJarName in assemblyPackageDependency := { name.value + "-assembly-" + version.value + "-deps.jar" },
assemblyDefaultJarName in assembly := { name.value + "-assembly-" + version.value + ".jar" },
mainClass in assembly := (mainClass or (mainClass in Runtime)).value,
fullClasspath in assembly := (fullClasspath or (fullClasspath in Runtime)).value,
externalDependencyClasspath in assembly := (externalDependencyClasspath or (externalDependencyClasspath in Runtime)).value
)
lazy val assemblySettings: Seq[sbt.Def.Setting[_]] = baseAssemblySettings
}
case class AssemblyOption(assemblyDirectory: File,
// include compiled class files from itself or subprojects
includeBin: Boolean = true,
includeScala: Boolean = true,
// include class files from external dependencies
includeDependency: Boolean = true,
excludedJars: Classpath = Nil,
excludedFiles: Seq[File] => Seq[File] = Assembly.defaultExcludedFiles, // use mergeStrategy instead
mergeStrategy: String => MergeStrategy = MergeStrategy.defaultMergeStrategy,
cacheOutput: Boolean = true,
cacheUnzip: Boolean = true,
appendContentHash: Boolean = false,
prependShellScript: Option[Seq[String]] = None,
maxHashLength: Option[Int] = None,
shadeRules: Seq[ShadeRule] = Seq(),
level: Level.Value)