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: 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

View File

@ -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

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") @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(

View File

@ -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

View File

@ -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)
} }
} }

View File

@ -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(

View File

@ -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

View File

@ -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.)