Merge pull request #148 from alexarchambault/topic/standalone-launcher-artifact

Automatically publish the proguarded JAR...
This commit is contained in:
Alexandre Archambault 2016-02-20 16:46:24 +01:00
commit b887677c0f
9 changed files with 138 additions and 32 deletions

View File

@ -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: 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=
branches:
only:
- master

View File

@ -266,7 +266,49 @@ lazy val cli = project
"-keep class coursier.cli.IsolatedClassLoader {\n public java.lang.String[] getIsolationTargets();\n}"
),
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

View File

@ -0,0 +1,6 @@
package coursier.cli
// dummy app to keep proguard quiet in 2.10
object Coursier {
def main(args: Array[String]): Unit = {}
}

View File

@ -48,6 +48,12 @@ case class CommonOptions(
@Value("organization:name")
@Short("E")
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)")
@Short("n")
parallel: Int = 6,
@ -58,6 +64,7 @@ case class CommonOptions(
cacheOptions: CacheOptions
) {
val verbose0 = verbose.length - (if (quiet) 1 else 0)
lazy val classifier0 = classifier.flatMap(_.split(',')).filter(_.nonEmpty)
}
case class CacheOptions(

View File

@ -169,7 +169,8 @@ class Helper(
module,
version,
configuration = "default(compile)",
exclusions = excludes
exclusions = excludes,
transitive = !intransitive
)
}
@ -287,14 +288,14 @@ class Helper(
val res0 = Option(subset).fold(res)(res.subset)
val artifacts =
if (sources || javadoc) {
var classifiers = Seq.empty[String]
if (classifier0.nonEmpty || sources || javadoc) {
var classifiers = classifier0
if (sources)
classifiers = classifiers :+ "sources"
if (javadoc)
classifiers = classifiers :+ "javadoc"
res0.classifiersArtifacts(classifiers)
res0.classifiersArtifacts(classifiers.distinct)
} else
res0.artifacts

View File

@ -45,6 +45,12 @@ object MavenRepository {
"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 =
if (sbtAttrStub) {
var name = module.name
@ -241,11 +247,7 @@ case class MavenRepository(
proj <- Pom.project(xml)
} yield proj.copy(
configurations = defaultConfigurations,
publications = Seq(
"compile" -> Publication(module.name, "jar", "jar", ""),
"docs" -> Publication(module.name, "doc", "jar", "javadoc"),
"sources" -> Publication(module.name, "src", "jar", "sources")
)
publications = defaultPublications(module.name)
)): (String \/ Project)
}
}

View File

@ -79,10 +79,23 @@ case class MavenSource(
overrideClassifiers match {
case Some(classifiers) =>
val classifiersSet = classifiers.toSet
project.publications.collect {
val publications = project.publications.collect {
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 =>
Seq(
artifactOf(

View File

@ -40,9 +40,14 @@ object MakeIvyXml {
n
}
val publicationElems = project.publications.map {
case (conf, pub) =>
var n = <artifact name={pub.name} type={pub.`type`} ext={pub.ext} conf={conf} />
val publications = project
.publications
.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)
n = n % <x e:classifier={pub.classifier} />.attributes
n

View File

@ -70,8 +70,9 @@ object Tasks {
sbt.Keys.thisProjectRef,
sbt.Keys.projectID,
sbt.Keys.scalaVersion,
sbt.Keys.scalaBinaryVersion
).map { (state, projectRef, projId, sv, sbv) =>
sbt.Keys.scalaBinaryVersion,
sbt.Keys.ivyConfigurations
).map { (state, projectRef, projId, sv, sbv, ivyConfs) =>
val packageTasks = Seq(packageBin, packageSrc, packageDoc)
val configs = Seq(Compile, Test)
@ -89,24 +90,50 @@ object Tasks {
None
}
sbtArtifacts.collect {
case Some((config, artifact)) =>
val name = FromSbt.sbtCrossVersionName(
artifact.name,
projId.crossVersion,
sv,
sbv
)
def artifactPublication(artifact: sbt.Artifact) = {
val publication = Publication(
name,
artifact.`type`,
artifact.extension,
artifact.classifier.getOrElse("")
)
val name = FromSbt.sbtCrossVersionName(
artifact.name,
projId.crossVersion,
sv,
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.)