diff --git a/cli/src/main/scala-2.11/coursier/cli/Coursier.scala b/cli/src/main/scala-2.11/coursier/cli/Coursier.scala index 0366ea41d..980d6f934 100644 --- a/cli/src/main/scala-2.11/coursier/cli/Coursier.scala +++ b/cli/src/main/scala-2.11/coursier/cli/Coursier.scala @@ -54,6 +54,10 @@ case class CommonOptions( @Value("classifier1,classifier2,...") @Short("C") classifier: List[String], + @Help("Default configuration (default(compile) by default)") + @Value("configuration") + @Short("c") + defaultConfiguration: String = "default(compile)", @Help("Maximum number of parallel downloads (default: 6)") @Short("n") parallel: Int = 6, @@ -316,7 +320,7 @@ case class Launch( } else { // Trying to get the main class of the first artifact val mainClassOpt = for { - (module, _) <- helper.moduleVersions.headOption + (module, _, _) <- helper.moduleVersionConfigs.headOption mainClass <- mainClasses.collectFirst { case ((org, name), mainClass) if org == module.organization && ( diff --git a/cli/src/main/scala-2.11/coursier/cli/Helper.scala b/cli/src/main/scala-2.11/coursier/cli/Helper.scala index 1d282edc3..46932bd93 100644 --- a/cli/src/main/scala-2.11/coursier/cli/Helper.scala +++ b/cli/src/main/scala-2.11/coursier/cli/Helper.scala @@ -118,10 +118,10 @@ class Helper( } - val (modVerErrors, moduleVersions) = Parse.moduleVersions(rawDependencies) + val (modVerCfgErrors, moduleVersionConfigs) = Parse.moduleVersionConfigs(rawDependencies) - prematureExitIf(modVerErrors.nonEmpty) { - s"Cannot parse dependencies:\n" + modVerErrors.map(" "+_).mkString("\n") + prematureExitIf(modVerCfgErrors.nonEmpty) { + s"Cannot parse dependencies:\n" + modVerCfgErrors.map(" "+_).mkString("\n") } @@ -164,12 +164,12 @@ class Helper( (mod.organization, mod.name) }.toSet - val dependencies = moduleVersions.map { - case (module, version) => + val dependencies = moduleVersionConfigs.map { + case (module, version, configOpt) => Dependency( module, version, - configuration = "default(compile)", + configuration = configOpt.getOrElse(defaultConfiguration), exclusions = excludes, transitive = !intransitive ) diff --git a/core/shared/src/main/scala/coursier/util/Parse.scala b/core/shared/src/main/scala/coursier/util/Parse.scala index 0f0c03b76..2b2f0c653 100644 --- a/core/shared/src/main/scala/coursier/util/Parse.scala +++ b/core/shared/src/main/scala/coursier/util/Parse.scala @@ -81,14 +81,52 @@ object Parse { } } + /** + * Parses coordinates like + * org:name:version + * possibly with attributes, like + * org:name;attr1=val1;attr2=val2:version + * and a configuration, like + * org:name:version:config + * or + * org:name;attr1=val1;attr2=val2:version:config + */ + def moduleVersionConfig(s: String): Either[String, (Module, String, Option[String])] = { + + val parts = s.split(":", 4) + + parts match { + case Array(org, rawName, version, config) => + module(s"$org:$rawName") + .right + .map((_, version, Some(config))) + + case Array(org, rawName, version) => + module(s"$org:$rawName") + .right + .map((_, version, None)) + + case _ => + Left(s"Malformed coordinates: $s") + } + } + /** * Parses a sequence of coordinates. * - * @return Sequence of errors, and sequence of modules/versions + * @return Sequence of errors, and sequence of modules / versions */ def moduleVersions(l: Seq[String]): (Seq[String], Seq[(Module, String)]) = valuesAndErrors(moduleVersion, l) + /** + * Parses a sequence of coordinates having an optional configuration. + * + * @return Sequence of errors, and sequence of modules / versions / optional configurations + */ + def moduleVersionConfigs(l: Seq[String]): (Seq[String], Seq[(Module, String, Option[String])]) = + valuesAndErrors(moduleVersionConfig, l) + def repository(s: String): Repository = if (s == "central") MavenRepository("https://repo1.maven.org/maven2")