/* * Copyright 2015 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.gradle.api.artifacts; import org.gradle.api.Action; import org.gradle.api.Incubating; import org.gradle.api.artifacts.component.ComponentSelector; import org.gradle.internal.HasInternalProtocol; /** * Allows replacing dependencies with other dependencies. * @since 2.5 */ @HasInternalProtocol @Incubating public interface DependencySubstitutions { /** * Adds a dependency substitution rule that is triggered for every dependency (including transitive) * when the configuration is being resolved. The action receives an instance of {@link DependencySubstitution} * that can be used to find out what dependency is being resolved and to influence the resolution process. * <p/> * Example: * <pre autoTested=''> * configurations { main } * // add dependency substitution rules * configurations.main.resolutionStrategy.dependencySubstitution { * // Use a rule to change the dependency module while leaving group + version intact * all { DependencySubstitution dependency -> * if (dependency.requested instanceof ModuleComponentSelector && dependency.requested.name == 'groovy-all') { * dependency.useTarget details.requested.group + ':groovy:' + details.requested.version * } * } * // Use a rule to replace all missing projects with module dependencies * all { DependencySubstitution dependency -> * if (dependency.requested instanceof ProjectComponentSelector) { * def targetProject = findProject(":${dependency.requested.path}") * if (targetProject == null) { * dependency.useTarget "org.myorg:" + dependency.requested.path + ":+" * } * } * } * } * </pre> * * The rules are evaluated in order they are declared. Rules are evaluated after forced modules are applied (see {@link ResolutionStrategy#force(Object...)} * * @return this */ DependencySubstitutions all(Action<? super DependencySubstitution> rule); /** * Create a ModuleComponentSelector from the provided input string. Strings must be in the format "{group}:{module}:{version}". */ ComponentSelector module(String notation); /** * Create a ProjectComponentSelector from the provided input string. Strings must be in the format ":path". */ ComponentSelector project(String path); /** * DSL-friendly mechanism to construct a dependency substitution for dependencies matching the provided selector. * <p/> * Examples: * <pre autoTested=''> * configurations { main } * configurations.main.resolutionStrategy.dependencySubstitution { * // Substitute project and module dependencies * substitute module('org.gradle:api') with project(':api') * substitute project(':util') with module('org.gradle:util:3.0') * * // Substitute one module dependency for another * substitute module('org.gradle:api:2.0') with module('org.gradle:api:2.1') * } * </pre> */ Substitution substitute(ComponentSelector substitutedDependency); /** * Provides a DSL-friendly mechanism for specifying the target of a substitution. */ interface Substitution { /** * Specify the target of the substitution. */ void with(ComponentSelector notation); } }