diff --git a/modules/sbt-coursier-shared/src/main/scala/coursier/sbtcoursiershared/InputsTasks.scala b/modules/sbt-coursier-shared/src/main/scala/coursier/sbtcoursiershared/InputsTasks.scala index 3df31e4c2..6968b2970 100644 --- a/modules/sbt-coursier-shared/src/main/scala/coursier/sbtcoursiershared/InputsTasks.scala +++ b/modules/sbt-coursier-shared/src/main/scala/coursier/sbtcoursiershared/InputsTasks.scala @@ -5,15 +5,26 @@ import lmcoursier.definitions.{Attributes, Classifier, Configuration, Dependency import lmcoursier.{FallbackDependency, FromSbt, Inputs} import coursier.sbtcoursiershared.SbtCoursierShared.autoImport._ import coursier.sbtcoursiershared.Structure._ -import sbt.Def +import sbt.{Def, SettingKey} import sbt.Keys._ import sbt.librarymanagement.{InclExclRule, ModuleID} import sbt.util.Logger import scala.collection.JavaConverters._ +import scala.language.reflectiveCalls object InputsTasks { + lazy val actualExcludeDependencies = + try { + sbt.Keys + .asInstanceOf[{ def allExcludeDependencies: SettingKey[scala.Seq[InclExclRule]] }] + .allExcludeDependencies + } catch { + case _: NoSuchMethodException => + excludeDependencies + } + private def coursierProject0( projId: ModuleID, dependencies: Seq[ModuleID], @@ -56,7 +67,7 @@ object InputsTasks { coursierProject0( projectID.in(projectRef).get(state), allDependenciesTask.value, - excludeDependencies.in(projectRef).get(state), + actualExcludeDependencies.in(projectRef).get(state), // should projectID.configurations be used instead? ivyConfigurations.in(projectRef).get(state), scalaVersion.in(projectRef).get(state), diff --git a/modules/sbt-coursier/src/sbt-test/shared-1/all-exclude-dependencies/build.sbt b/modules/sbt-coursier/src/sbt-test/shared-1/all-exclude-dependencies/build.sbt new file mode 100644 index 000000000..8c2b3c509 --- /dev/null +++ b/modules/sbt-coursier/src/sbt-test/shared-1/all-exclude-dependencies/build.sbt @@ -0,0 +1,11 @@ + +scalaVersion := "2.11.8" + +organization := "io.get-coursier.test" +name := "sbt-coursier-all-exclude-dependencies" +version := "0.1.0-SNAPSHOT" + +libraryDependencies += "com.github.alexarchambault" %% "argonaut-shapeless_6.1" % "1.0.0-RC1" + +allExcludeDependencies += sbt.ExclusionRule("com.chuusai", "shapeless_2.11") +allExcludeDependencies += "io.argonaut" %% "argonaut" diff --git a/modules/sbt-coursier/src/sbt-test/shared-1/all-exclude-dependencies/coursier b/modules/sbt-coursier/src/sbt-test/shared-1/all-exclude-dependencies/coursier new file mode 100755 index 000000000..6cada6f8b Binary files /dev/null and b/modules/sbt-coursier/src/sbt-test/shared-1/all-exclude-dependencies/coursier differ diff --git a/modules/sbt-coursier/src/sbt-test/shared-1/all-exclude-dependencies/project/build.properties b/modules/sbt-coursier/src/sbt-test/shared-1/all-exclude-dependencies/project/build.properties new file mode 100644 index 000000000..3149e6ba1 --- /dev/null +++ b/modules/sbt-coursier/src/sbt-test/shared-1/all-exclude-dependencies/project/build.properties @@ -0,0 +1 @@ +sbt.version=1.3.0-M2 diff --git a/modules/sbt-coursier/src/sbt-test/shared-1/all-exclude-dependencies/project/plugins.sbt b/modules/sbt-coursier/src/sbt-test/shared-1/all-exclude-dependencies/project/plugins.sbt new file mode 100644 index 000000000..71a44ffd3 --- /dev/null +++ b/modules/sbt-coursier/src/sbt-test/shared-1/all-exclude-dependencies/project/plugins.sbt @@ -0,0 +1,13 @@ +addSbtPlugin { + + val name = sys.props.getOrElse( + "plugin.name", + sys.error("plugin.name Java property not set") + ) + val version = sys.props.getOrElse( + "plugin.version", + sys.error("plugin.version Java property not set") + ) + + "io.get-coursier" % name % version +} \ No newline at end of file diff --git a/modules/sbt-coursier/src/sbt-test/shared-1/all-exclude-dependencies/src/main/scala/Main.scala b/modules/sbt-coursier/src/sbt-test/shared-1/all-exclude-dependencies/src/main/scala/Main.scala new file mode 100644 index 000000000..1bc056610 --- /dev/null +++ b/modules/sbt-coursier/src/sbt-test/shared-1/all-exclude-dependencies/src/main/scala/Main.scala @@ -0,0 +1,32 @@ +import java.io.File +import java.nio.file.Files + +import scala.util.Try + +object Main extends App { + + def classFound(clsName: String) = Try( + Thread.currentThread() + .getContextClassLoader() + .loadClass(clsName) + ).toOption.nonEmpty + + val shapelessFound = classFound("shapeless.HList") + val argonautFound = classFound("argonaut.Json") + val argonautShapelessFound = classFound("argonaut.derive.MkEncodeJson") + + assert( + argonautShapelessFound, + "Expected to find class from argonaut-shapeless" + ) + assert( + !shapelessFound, + "Expected not to find classes from shapeless" + ) + assert( + !argonautFound, + "Expected not to find classes from argonaut" + ) + + Files.write(new File("output").toPath, "OK".getBytes("UTF-8")) +} diff --git a/modules/sbt-coursier/src/sbt-test/shared-1/all-exclude-dependencies/test b/modules/sbt-coursier/src/sbt-test/shared-1/all-exclude-dependencies/test new file mode 100644 index 000000000..21084fb8e --- /dev/null +++ b/modules/sbt-coursier/src/sbt-test/shared-1/all-exclude-dependencies/test @@ -0,0 +1,5 @@ +$ delete output +> run +$ exists output +> publishLocal +$ exec java -jar coursier launch io.get-coursier.test:sbt-coursier-all-exclude-dependencies_2.11:0.1.0-SNAPSHOT diff --git a/modules/sbt-lm-coursier/src/main/scala/coursier/sbtlmcoursier/LmCoursierPlugin.scala b/modules/sbt-lm-coursier/src/main/scala/coursier/sbtlmcoursier/LmCoursierPlugin.scala index 54938743f..995d86c1b 100644 --- a/modules/sbt-lm-coursier/src/main/scala/coursier/sbtlmcoursier/LmCoursierPlugin.scala +++ b/modules/sbt-lm-coursier/src/main/scala/coursier/sbtlmcoursier/LmCoursierPlugin.scala @@ -3,13 +3,15 @@ package coursier.sbtlmcoursier import lmcoursier.definitions.Authentication import lmcoursier.{CoursierConfiguration, CoursierDependencyResolution, Inputs} import coursier.sbtcoursiershared.InputsTasks.credentialsTask -import coursier.sbtcoursiershared.SbtCoursierShared +import coursier.sbtcoursiershared.{InputsTasks, SbtCoursierShared} import sbt.{AutoPlugin, Classpaths, Def, Setting, Task, taskKey} import sbt.Project.inTask import sbt.KeyRanks.DTask -import sbt.Keys.{appConfiguration, autoScalaLibrary, classpathTypes, dependencyResolution, excludeDependencies, scalaBinaryVersion, scalaModuleInfo, scalaOrganization, scalaVersion, streams, updateClassifiers, updateSbtClassifiers} +import sbt.Keys.{appConfiguration, autoScalaLibrary, classpathTypes, dependencyResolution, scalaBinaryVersion, scalaModuleInfo, scalaOrganization, scalaVersion, streams, updateClassifiers, updateSbtClassifiers} import sbt.librarymanagement.DependencyResolution +import scala.language.reflectiveCalls + object LmCoursierPlugin extends AutoPlugin { import SbtCoursierShared.autoImport._ @@ -78,7 +80,7 @@ object LmCoursierPlugin extends AutoPlugin { val scalaVer = scalaVersion.value val interProjectDependencies = coursierInterProjectDependencies.value val excludeDeps = Inputs.exclusions( - excludeDependencies.value, + InputsTasks.actualExcludeDependencies.value, scalaVer, scalaBinaryVersion.value, streams.value.log