diff --git a/main/src/main/scala/sbt/internal/server/BuildServerProtocol.scala b/main/src/main/scala/sbt/internal/server/BuildServerProtocol.scala index 8f3b91801..35b3d4cf5 100644 --- a/main/src/main/scala/sbt/internal/server/BuildServerProtocol.scala +++ b/main/src/main/scala/sbt/internal/server/BuildServerProtocol.scala @@ -577,11 +577,22 @@ object BuildServerProtocol { } private def internalDependencyConfigurationsSetting = Def.settingDyn { - val directDependencies = Keys.internalDependencyConfigurations.value.map { - case (project, rawConfigs) => - val configs = rawConfigs.flatMap(_.split(",")).map(name => ConfigKey(name.trim)) - (project, configs) - } + val allScopes = bspWorkspace.value.map { case (_, scope) => scope }.toSet + val directDependencies = Keys.internalDependencyConfigurations.value + .map { + case (project, rawConfigs) => + val configs = rawConfigs + .flatMap(_.split(",")) + .map(name => ConfigKey(name.trim)) + .filter { config => + val scope = Scope.Global.in(project, config) + allScopes.contains(scope) + } + (project, configs) + } + .filter { + case (_, configs) => configs.nonEmpty + } val ref = Keys.thisProjectRef.value val thisConfig = Keys.configuration.value val transitiveDependencies = for { @@ -589,7 +600,8 @@ object BuildServerProtocol { config <- configs if dep != ref || config.name != thisConfig.name } yield Keys.bspInternalDependencyConfigurations.in(dep, config) Def.setting { - val allDependencies = directDependencies ++ transitiveDependencies.join.value.flatten + val allDependencies = directDependencies ++ + transitiveDependencies.join.value.flatten allDependencies .groupBy(_._1) .mapValues { deps => diff --git a/sbt/src/sbt-test/dependency-management/custom-config/build.sbt b/sbt/src/sbt-test/dependency-management/custom-config/build.sbt new file mode 100644 index 000000000..427d4c5fe --- /dev/null +++ b/sbt/src/sbt-test/dependency-management/custom-config/build.sbt @@ -0,0 +1,49 @@ +// Custom configurations +lazy val Common = config("common").describedAs("Dependencies required in all configurations.") +lazy val Scalate = config("scalate").extend(Common).describedAs("Dependencies for using Scalate utilities.") +lazy val Saxon = config("saxon").extend(Common).describedAs("Dependencies for using Saxon utilities.") + +// Define a customized compile configuration that includes +// dependencies defined in our other custom configurations +lazy val CustomCompile = config("compile").extend(Saxon, Common, Scalate) + +// factor out common settings +ThisBuild / organization := "com.example" +ThisBuild / scalaVersion := "2.10.6" +ThisBuild / version := "0.1.0-SNAPSHOT" + +// An example project that only uses the Scalate utilities. +lazy val a = (project in file("a")) + .dependsOn(utils % "compile->scalate") + +// An example project that uses the Scalate and Saxon utilities. +// For the configurations defined here, this is equivalent to doing dependsOn(utils), +// but if there were more configurations, it would select only the Scalate and Saxon +// dependencies. +lazy val b = (project in file("b")) + .dependsOn(utils % "compile->scalate,saxon") + +// Defines the utilities project +lazy val utils = (project in file("utils")) + .settings( + inConfig(Common)(Defaults.configSettings), // Add the src/common/scala/ compilation configuration. + addArtifact(Common / packageBin / artifact, Common / packageBin), // Publish the common artifact + + // We want our Common sources to have access to all of the dependencies on the classpaths + // for compile and test, but when depended on, it should only require dependencies in 'common' + Common / classpathConfiguration := CustomCompile, + + // Modify the default Ivy configurations. + // 'overrideConfigs' ensures that Compile is replaced by CustomCompile + ivyConfigurations := overrideConfigs(Scalate, Saxon, Common, CustomCompile)(ivyConfigurations.value), + + // Put all dependencies without an explicit configuration into Common (optional) + defaultConfiguration := Some(Common), + + // Declare dependencies in the appropriate configurations + libraryDependencies ++= Seq( + "org.fusesource.scalate" % "scalate-core" % "1.5.0" % Scalate, + "org.squeryl" %% "squeryl" % "0.9.5-6" % Scalate, + "net.sf.saxon" % "saxon" % "8.7" % Saxon + ) + ) diff --git a/sbt/src/sbt-test/dependency-management/custom-config/test b/sbt/src/sbt-test/dependency-management/custom-config/test new file mode 100644 index 000000000..477407e68 --- /dev/null +++ b/sbt/src/sbt-test/dependency-management/custom-config/test @@ -0,0 +1 @@ +> name