mirror of https://github.com/sbt/sbt.git
Merge pull request #148 from alexarchambault/topic/standalone-launcher-artifact
Automatically publish the proguarded JAR...
This commit is contained in:
commit
b887677c0f
|
|
@ -25,3 +25,6 @@ env:
|
||||||
- secure: miHFMwVRD/yjOLy794nOwc2lJTMyL5O0MXABT9ksg5ejQy1FrFVc2YH86Agp80W02/lGLGl0qWCiK1TBcs9q4Apt01nkD1a/0/iuTRm//bdhnu8BbRxFITf+2cyYJVytKPsF585aHldMv1rwZs3TDaTzEEecAEki5r50yyTVo7ycG0lVj9aVWXerKRMIT54Wb8M6nqbyRB1jGWT0ETNU13vOvQznPTUXQG5hsiKnGYRf8T3umOMdOHpV0rvdwYqAIMsikaAFcYCS5P/pLXMtmRHICH9KUG8TV/ST07p1BXtbBg9y1Q+lpnXotXh4ZNoWOp8B6v7fxJ/WlLYTDROWCiHJ4s2V4Di00db/nW4OWrEEBlrh7vJ/npZqyt9V9YeNv6alxi+DCESwusgvD4Cx5c3zh+2X6RB6BYwWHlFnd80rmsLe4R4fFUcc8E/ZR9vUFjP1CsQKqfJ5yfKR6V+n8jK8FjLpoaU9PHPo2H4V3FZM/fCLcxhE37vfaYI7/O7MqE/cdGpZIuz7g3c4toWCgNZJDn8iJCPmrgcbW5zbfDxvWU2K816ycgnUwSQ5dufrJpAbLNrjR1O8EPRkMDDp9bB7/4RVQvfDfP9GGoiHPHHgxGzY0Lf5bm+Bj1mRfB5/SXHd3IjhUCD9q7eD1/ANifEYALC5BJ4TB8RhQUPU8uM=
|
- secure: miHFMwVRD/yjOLy794nOwc2lJTMyL5O0MXABT9ksg5ejQy1FrFVc2YH86Agp80W02/lGLGl0qWCiK1TBcs9q4Apt01nkD1a/0/iuTRm//bdhnu8BbRxFITf+2cyYJVytKPsF585aHldMv1rwZs3TDaTzEEecAEki5r50yyTVo7ycG0lVj9aVWXerKRMIT54Wb8M6nqbyRB1jGWT0ETNU13vOvQznPTUXQG5hsiKnGYRf8T3umOMdOHpV0rvdwYqAIMsikaAFcYCS5P/pLXMtmRHICH9KUG8TV/ST07p1BXtbBg9y1Q+lpnXotXh4ZNoWOp8B6v7fxJ/WlLYTDROWCiHJ4s2V4Di00db/nW4OWrEEBlrh7vJ/npZqyt9V9YeNv6alxi+DCESwusgvD4Cx5c3zh+2X6RB6BYwWHlFnd80rmsLe4R4fFUcc8E/ZR9vUFjP1CsQKqfJ5yfKR6V+n8jK8FjLpoaU9PHPo2H4V3FZM/fCLcxhE37vfaYI7/O7MqE/cdGpZIuz7g3c4toWCgNZJDn8iJCPmrgcbW5zbfDxvWU2K816ycgnUwSQ5dufrJpAbLNrjR1O8EPRkMDDp9bB7/4RVQvfDfP9GGoiHPHHgxGzY0Lf5bm+Bj1mRfB5/SXHd3IjhUCD9q7eD1/ANifEYALC5BJ4TB8RhQUPU8uM=
|
||||||
- secure: 2/SSqa7A+aIzTJrMuqfK53QoHqes8HZPpIXUC9BH+bP2V2n7LqlFCnLZ9OSFfiJYfgeYMQDILpt8GTXHYc7JgM/N9xXpywrpYNDCYo7GMhqRyUPQOuK9044IRnZmme289Ut6ozHHptZUeZp/9DEUNZcPOxTN+KbzbHrUL+9l5BxnAxJ3e0HihxhmaINrla3T36EetdfINigarB9muyvuCRdRhZjwxsSF1fo5P+ZgWvAIDhPgNJH8eyjxHVbTabk7efPtWNWu0HjyOqJaIVk+TNjuQhvQPHKpYel0gVlCAfUjq7ZP8hZurfC6NjCFcnfTZ3d4R8GDcWJ47pgBWND8saIQOigNd7KHBPntD4fEJqgBSq3ZWakNBYzOtm8CxMGmiJHDCVqAEGzUG+lowN+SnPS2UluL3QtZ7oL/7MeJqCscH7sPwHtmZY+o0Muqo0ZJ2T2TzekQNYOAE7jeSzG1xOa/NNghny5fT+w6asPxfeolkMgyzuRFp1SLaLUf/XRV4fux0meGY9NIXso47xMSfAYVAAXT1FA2OOwmM1O4yvm3Ur95oEGDNw6z7MnWOSKS663WFwuw2cCaheCfAwvoa5jZUMWMbyUM/cBTgCaQdmETpvCzZzUr5Ls/nBXjyiTdJaQLZATr7HSGZHgYVmEAhVwBvuhTar/6VUZUMKGc2P4=
|
- secure: 2/SSqa7A+aIzTJrMuqfK53QoHqes8HZPpIXUC9BH+bP2V2n7LqlFCnLZ9OSFfiJYfgeYMQDILpt8GTXHYc7JgM/N9xXpywrpYNDCYo7GMhqRyUPQOuK9044IRnZmme289Ut6ozHHptZUeZp/9DEUNZcPOxTN+KbzbHrUL+9l5BxnAxJ3e0HihxhmaINrla3T36EetdfINigarB9muyvuCRdRhZjwxsSF1fo5P+ZgWvAIDhPgNJH8eyjxHVbTabk7efPtWNWu0HjyOqJaIVk+TNjuQhvQPHKpYel0gVlCAfUjq7ZP8hZurfC6NjCFcnfTZ3d4R8GDcWJ47pgBWND8saIQOigNd7KHBPntD4fEJqgBSq3ZWakNBYzOtm8CxMGmiJHDCVqAEGzUG+lowN+SnPS2UluL3QtZ7oL/7MeJqCscH7sPwHtmZY+o0Muqo0ZJ2T2TzekQNYOAE7jeSzG1xOa/NNghny5fT+w6asPxfeolkMgyzuRFp1SLaLUf/XRV4fux0meGY9NIXso47xMSfAYVAAXT1FA2OOwmM1O4yvm3Ur95oEGDNw6z7MnWOSKS663WFwuw2cCaheCfAwvoa5jZUMWMbyUM/cBTgCaQdmETpvCzZzUr5Ls/nBXjyiTdJaQLZATr7HSGZHgYVmEAhVwBvuhTar/6VUZUMKGc2P4=
|
||||||
- secure: NmXh4uxqvvqxYvOBOiXE131HajCYhJyd9+7kc1YjllRZVYG11YLah9Np7qnRUyugNOdcBnWVQGlfDHOFe8GHQsZKt5PvsIzxszTor0GeDQOePX3L4YXPkZRJatmoJJ0COxdI6weCAWkI6Zr934RsOndT0mO55gk9c6eeXCcLdNjAJ3izGQHy5Wb2KTzwMhBfwjdTQ0s65c1rzz5dZ/JODilWfTHiHsz+4sKwWVmAvXDTjePd0X3svX775ot23QesJgtaC/p0AKSLcHg3zEjKkJJvvLooQyNn/zU/bio/UatDZWXnNMsTBfEr3qUedjoOY65g3EX/vYlbNRkF3Itk0dpuPooTFmezJASI4ZpewBS9OvPZheMmU/dy5Bx//622x7p4MHyao9IvYmSX0C92VWEd3gwkSzKCJtBEz4Csd5BaGhzeL41di6NSVx4IEiehC9191G1wk4Yj7S2t69N6OdAJEq+znQlYISF5ogCqip7PuesBMYTW4FaIgpnfW/OYP6VpWW87ohw/dz/CcTzP9MzuoM249EHNZKTfnJrmPJBRYSn+W4y9sTgGElPhY1U/NVQ+C/9Fov1kHFD25WeTDPdZe6yCczaUrcvfTDitfo6qnWf8ZW5dJMXN744idaZ25AT/SGoCzkPXMe+us5XLTAOtrbBMP8NXLMv5OtU999E=
|
- secure: NmXh4uxqvvqxYvOBOiXE131HajCYhJyd9+7kc1YjllRZVYG11YLah9Np7qnRUyugNOdcBnWVQGlfDHOFe8GHQsZKt5PvsIzxszTor0GeDQOePX3L4YXPkZRJatmoJJ0COxdI6weCAWkI6Zr934RsOndT0mO55gk9c6eeXCcLdNjAJ3izGQHy5Wb2KTzwMhBfwjdTQ0s65c1rzz5dZ/JODilWfTHiHsz+4sKwWVmAvXDTjePd0X3svX775ot23QesJgtaC/p0AKSLcHg3zEjKkJJvvLooQyNn/zU/bio/UatDZWXnNMsTBfEr3qUedjoOY65g3EX/vYlbNRkF3Itk0dpuPooTFmezJASI4ZpewBS9OvPZheMmU/dy5Bx//622x7p4MHyao9IvYmSX0C92VWEd3gwkSzKCJtBEz4Csd5BaGhzeL41di6NSVx4IEiehC9191G1wk4Yj7S2t69N6OdAJEq+znQlYISF5ogCqip7PuesBMYTW4FaIgpnfW/OYP6VpWW87ohw/dz/CcTzP9MzuoM249EHNZKTfnJrmPJBRYSn+W4y9sTgGElPhY1U/NVQ+C/9Fov1kHFD25WeTDPdZe6yCczaUrcvfTDitfo6qnWf8ZW5dJMXN744idaZ25AT/SGoCzkPXMe+us5XLTAOtrbBMP8NXLMv5OtU999E=
|
||||||
|
branches:
|
||||||
|
only:
|
||||||
|
- master
|
||||||
|
|
|
||||||
44
build.sbt
44
build.sbt
|
|
@ -266,7 +266,49 @@ lazy val cli = project
|
||||||
"-keep class coursier.cli.IsolatedClassLoader {\n public java.lang.String[] getIsolationTargets();\n}"
|
"-keep class coursier.cli.IsolatedClassLoader {\n public java.lang.String[] getIsolationTargets();\n}"
|
||||||
),
|
),
|
||||||
javaOptions in (Proguard, ProguardKeys.proguard) := Seq("-Xmx3172M"),
|
javaOptions in (Proguard, ProguardKeys.proguard) := Seq("-Xmx3172M"),
|
||||||
artifactPath in Proguard := (ProguardKeys.proguardDirectory in Proguard).value / "coursier-standalone.jar"
|
artifactPath in Proguard := (ProguardKeys.proguardDirectory in Proguard).value / "coursier-standalone.jar",
|
||||||
|
artifacts ++= {
|
||||||
|
if (scalaBinaryVersion.value == "2.10")
|
||||||
|
Nil
|
||||||
|
else Seq(
|
||||||
|
Artifact(
|
||||||
|
moduleName.value,
|
||||||
|
"jar",
|
||||||
|
"jar",
|
||||||
|
"standalone"
|
||||||
|
)
|
||||||
|
)
|
||||||
|
},
|
||||||
|
packagedArtifacts <++= {
|
||||||
|
(
|
||||||
|
moduleName,
|
||||||
|
scalaBinaryVersion,
|
||||||
|
ProguardKeys.proguard in Proguard
|
||||||
|
).map {
|
||||||
|
(mod, sbv, files) =>
|
||||||
|
if (sbv == "2.10")
|
||||||
|
Map.empty[Artifact, File]
|
||||||
|
else {
|
||||||
|
val f = files match {
|
||||||
|
case Seq(f) => f
|
||||||
|
case Seq() =>
|
||||||
|
throw new Exception("Found no proguarded files. Expected one.")
|
||||||
|
case _ =>
|
||||||
|
throw new Exception("Found several proguarded files. Don't know how to publish all of them.")
|
||||||
|
}
|
||||||
|
|
||||||
|
Map(
|
||||||
|
// FIXME Same Artifact as above
|
||||||
|
Artifact(
|
||||||
|
mod,
|
||||||
|
"jar",
|
||||||
|
"jar",
|
||||||
|
"standalone"
|
||||||
|
) -> f
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
lazy val web = project
|
lazy val web = project
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,6 @@
|
||||||
|
package coursier.cli
|
||||||
|
|
||||||
|
// dummy app to keep proguard quiet in 2.10
|
||||||
|
object Coursier {
|
||||||
|
def main(args: Array[String]): Unit = {}
|
||||||
|
}
|
||||||
|
|
@ -48,6 +48,12 @@ case class CommonOptions(
|
||||||
@Value("organization:name")
|
@Value("organization:name")
|
||||||
@Short("E")
|
@Short("E")
|
||||||
exclude: List[String],
|
exclude: List[String],
|
||||||
|
@Help("Consider provided dependencies to be intransitive. Applies to all the provided dependencies.")
|
||||||
|
intransitive: Boolean,
|
||||||
|
@Help("Classifiers that should be fetched")
|
||||||
|
@Value("classifier1,classifier2,...")
|
||||||
|
@Short("C")
|
||||||
|
classifier: List[String],
|
||||||
@Help("Maximum number of parallel downloads (default: 6)")
|
@Help("Maximum number of parallel downloads (default: 6)")
|
||||||
@Short("n")
|
@Short("n")
|
||||||
parallel: Int = 6,
|
parallel: Int = 6,
|
||||||
|
|
@ -58,6 +64,7 @@ case class CommonOptions(
|
||||||
cacheOptions: CacheOptions
|
cacheOptions: CacheOptions
|
||||||
) {
|
) {
|
||||||
val verbose0 = verbose.length - (if (quiet) 1 else 0)
|
val verbose0 = verbose.length - (if (quiet) 1 else 0)
|
||||||
|
lazy val classifier0 = classifier.flatMap(_.split(',')).filter(_.nonEmpty)
|
||||||
}
|
}
|
||||||
|
|
||||||
case class CacheOptions(
|
case class CacheOptions(
|
||||||
|
|
|
||||||
|
|
@ -169,7 +169,8 @@ class Helper(
|
||||||
module,
|
module,
|
||||||
version,
|
version,
|
||||||
configuration = "default(compile)",
|
configuration = "default(compile)",
|
||||||
exclusions = excludes
|
exclusions = excludes,
|
||||||
|
transitive = !intransitive
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -287,14 +288,14 @@ class Helper(
|
||||||
val res0 = Option(subset).fold(res)(res.subset)
|
val res0 = Option(subset).fold(res)(res.subset)
|
||||||
|
|
||||||
val artifacts =
|
val artifacts =
|
||||||
if (sources || javadoc) {
|
if (classifier0.nonEmpty || sources || javadoc) {
|
||||||
var classifiers = Seq.empty[String]
|
var classifiers = classifier0
|
||||||
if (sources)
|
if (sources)
|
||||||
classifiers = classifiers :+ "sources"
|
classifiers = classifiers :+ "sources"
|
||||||
if (javadoc)
|
if (javadoc)
|
||||||
classifiers = classifiers :+ "javadoc"
|
classifiers = classifiers :+ "javadoc"
|
||||||
|
|
||||||
res0.classifiersArtifacts(classifiers)
|
res0.classifiersArtifacts(classifiers.distinct)
|
||||||
} else
|
} else
|
||||||
res0.artifacts
|
res0.artifacts
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -45,6 +45,12 @@ object MavenRepository {
|
||||||
"test" -> Seq("runtime")
|
"test" -> Seq("runtime")
|
||||||
)
|
)
|
||||||
|
|
||||||
|
def defaultPublications(moduleName: String) = Seq(
|
||||||
|
"compile" -> Publication(moduleName, "jar", "jar", ""),
|
||||||
|
"docs" -> Publication(moduleName, "doc", "jar", "javadoc"),
|
||||||
|
"sources" -> Publication(moduleName, "src", "jar", "sources")
|
||||||
|
)
|
||||||
|
|
||||||
def dirModuleName(module: Module, sbtAttrStub: Boolean): String =
|
def dirModuleName(module: Module, sbtAttrStub: Boolean): String =
|
||||||
if (sbtAttrStub) {
|
if (sbtAttrStub) {
|
||||||
var name = module.name
|
var name = module.name
|
||||||
|
|
@ -241,11 +247,7 @@ case class MavenRepository(
|
||||||
proj <- Pom.project(xml)
|
proj <- Pom.project(xml)
|
||||||
} yield proj.copy(
|
} yield proj.copy(
|
||||||
configurations = defaultConfigurations,
|
configurations = defaultConfigurations,
|
||||||
publications = Seq(
|
publications = defaultPublications(module.name)
|
||||||
"compile" -> Publication(module.name, "jar", "jar", ""),
|
|
||||||
"docs" -> Publication(module.name, "doc", "jar", "javadoc"),
|
|
||||||
"sources" -> Publication(module.name, "src", "jar", "sources")
|
|
||||||
)
|
|
||||||
)): (String \/ Project)
|
)): (String \/ Project)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -79,10 +79,23 @@ case class MavenSource(
|
||||||
overrideClassifiers match {
|
overrideClassifiers match {
|
||||||
case Some(classifiers) =>
|
case Some(classifiers) =>
|
||||||
val classifiersSet = classifiers.toSet
|
val classifiersSet = classifiers.toSet
|
||||||
project.publications.collect {
|
val publications = project.publications.collect {
|
||||||
case (_, p) if classifiersSet(p.classifier) =>
|
case (_, p) if classifiersSet(p.classifier) =>
|
||||||
artifactOf(dependency.module, p)
|
p
|
||||||
}
|
}
|
||||||
|
|
||||||
|
val publications0 =
|
||||||
|
if (publications.isEmpty)
|
||||||
|
classifiers.map { classifier =>
|
||||||
|
Publication(dependency.module.name, "jar", "jar", classifier)
|
||||||
|
}
|
||||||
|
else
|
||||||
|
publications
|
||||||
|
|
||||||
|
publications0.map { p =>
|
||||||
|
artifactOf(dependency.module, p)
|
||||||
|
}
|
||||||
|
|
||||||
case None =>
|
case None =>
|
||||||
Seq(
|
Seq(
|
||||||
artifactOf(
|
artifactOf(
|
||||||
|
|
|
||||||
|
|
@ -40,9 +40,14 @@ object MakeIvyXml {
|
||||||
n
|
n
|
||||||
}
|
}
|
||||||
|
|
||||||
val publicationElems = project.publications.map {
|
val publications = project
|
||||||
case (conf, pub) =>
|
.publications
|
||||||
var n = <artifact name={pub.name} type={pub.`type`} ext={pub.ext} conf={conf} />
|
.groupBy { case (_, p) => p }
|
||||||
|
.mapValues { _.map { case (cfg, _) => cfg } }
|
||||||
|
|
||||||
|
val publicationElems = publications.map {
|
||||||
|
case (pub, configs) =>
|
||||||
|
var n = <artifact name={pub.name} type={pub.`type`} ext={pub.ext} conf={configs.mkString(",")} />
|
||||||
if (pub.classifier.nonEmpty)
|
if (pub.classifier.nonEmpty)
|
||||||
n = n % <x e:classifier={pub.classifier} />.attributes
|
n = n % <x e:classifier={pub.classifier} />.attributes
|
||||||
n
|
n
|
||||||
|
|
|
||||||
|
|
@ -70,8 +70,9 @@ object Tasks {
|
||||||
sbt.Keys.thisProjectRef,
|
sbt.Keys.thisProjectRef,
|
||||||
sbt.Keys.projectID,
|
sbt.Keys.projectID,
|
||||||
sbt.Keys.scalaVersion,
|
sbt.Keys.scalaVersion,
|
||||||
sbt.Keys.scalaBinaryVersion
|
sbt.Keys.scalaBinaryVersion,
|
||||||
).map { (state, projectRef, projId, sv, sbv) =>
|
sbt.Keys.ivyConfigurations
|
||||||
|
).map { (state, projectRef, projId, sv, sbv, ivyConfs) =>
|
||||||
|
|
||||||
val packageTasks = Seq(packageBin, packageSrc, packageDoc)
|
val packageTasks = Seq(packageBin, packageSrc, packageDoc)
|
||||||
val configs = Seq(Compile, Test)
|
val configs = Seq(Compile, Test)
|
||||||
|
|
@ -89,24 +90,50 @@ object Tasks {
|
||||||
None
|
None
|
||||||
}
|
}
|
||||||
|
|
||||||
sbtArtifacts.collect {
|
def artifactPublication(artifact: sbt.Artifact) = {
|
||||||
case Some((config, artifact)) =>
|
|
||||||
val name = FromSbt.sbtCrossVersionName(
|
|
||||||
artifact.name,
|
|
||||||
projId.crossVersion,
|
|
||||||
sv,
|
|
||||||
sbv
|
|
||||||
)
|
|
||||||
|
|
||||||
val publication = Publication(
|
val name = FromSbt.sbtCrossVersionName(
|
||||||
name,
|
artifact.name,
|
||||||
artifact.`type`,
|
projId.crossVersion,
|
||||||
artifact.extension,
|
sv,
|
||||||
artifact.classifier.getOrElse("")
|
sbv
|
||||||
)
|
)
|
||||||
|
|
||||||
config -> publication
|
Publication(
|
||||||
|
name,
|
||||||
|
artifact.`type`,
|
||||||
|
artifact.extension,
|
||||||
|
artifact.classifier.getOrElse("")
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
val sbtArtifactsPublication = sbtArtifacts.collect {
|
||||||
|
case Some((config, artifact)) =>
|
||||||
|
config -> artifactPublication(artifact)
|
||||||
|
}
|
||||||
|
|
||||||
|
val stdArtifactsSet = sbtArtifacts.flatMap(_.map { case (_, a) => a }.toSeq).toSet
|
||||||
|
|
||||||
|
// Second-way of getting artifacts from SBT
|
||||||
|
// No obvious way of getting the corresponding publishArtifact value for the ones
|
||||||
|
// only here, it seems.
|
||||||
|
val extraSbtArtifacts = Option(artifacts.in(projectRef).getOrElse(state, null))
|
||||||
|
.toSeq
|
||||||
|
.flatten
|
||||||
|
.filterNot(stdArtifactsSet)
|
||||||
|
|
||||||
|
// Seems that SBT does that - if an artifact has no configs,
|
||||||
|
// it puts it in all of them. See for example what happens to
|
||||||
|
// the standalone JAR artifact of the coursier cli module.
|
||||||
|
def allConfigsIfEmpty(configs: Iterable[sbt.Configuration]): Iterable[sbt.Configuration] =
|
||||||
|
if (configs.isEmpty) ivyConfs else configs
|
||||||
|
|
||||||
|
val extraSbtArtifactsPublication = for {
|
||||||
|
artifact <- extraSbtArtifacts
|
||||||
|
config <- allConfigsIfEmpty(artifact.configurations) if config.isPublic
|
||||||
|
} yield config.name -> artifactPublication(artifact)
|
||||||
|
|
||||||
|
sbtArtifactsPublication ++ extraSbtArtifactsPublication
|
||||||
}
|
}
|
||||||
|
|
||||||
// FIXME More things should possibly be put here too (resolvers, etc.)
|
// FIXME More things should possibly be put here too (resolvers, etc.)
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue