解析策略 (ResolutionStrategy)

定义了围绕依赖解析的策略。例如,强制使用某些依赖版本、替换、冲突解决或快照超时。

示例

plugins {
    id 'java' // so that there are some configurations
}

configurations.all {
  resolutionStrategy {
    // fail eagerly on version conflict (includes transitive dependencies)
    // e.g. multiple different versions of the same dependency (group and name are equal)
    failOnVersionConflict()

    // prefer modules that are part of this build (multi-project or composite build) over external modules
    preferProjectModules()

    // force certain versions of dependencies (including transitive)
    //  *append new forced modules:
    force 'asm:asm-all:3.3.1', 'commons-io:commons-io:1.4'
    //  *replace existing forced modules with new ones:
    forcedModules = ['asm:asm-all:3.3.1']

    // add dependency substitution rules
    dependencySubstitution {
      substitute module('org.gradle:api') using project(':api')
      substitute project(':util') using module('org.gradle:util:3.0')
    }

    // cache dynamic versions for 10 minutes
    cacheDynamicVersionsFor 10*60, 'seconds'
    // don't cache changing modules at all
    cacheChangingModulesFor 0, 'seconds'
  }
}

属性

属性描述
capabilitiesResolution

能力解析策略。

componentSelection

当前配置的版本选择规则对象。

dependencySubstitution

为此配置设置的依赖替换规则集。

forcedModules

返回当前配置的强制模块。有关强制版本的更多信息,请参阅 ResolutionStrategy.force(java.lang.Object[])

方法

方法描述
activateDependencyLocking()

在 Gradle 中激活依赖锁定支持。一旦为配置启用,解析结果就可以保存并在后续构建中重复使用。这使得在使用动态版本时能够实现可重现的构建。

cacheChangingModulesFor(value, units)

设置可变模块的缓存时长,单位以字符串表示。

cacheChangingModulesFor(value, units)

设置可变模块的缓存时长。

cacheDynamicVersionsFor(value, units)

设置动态版本的缓存时长,单位以字符串表示。

cacheDynamicVersionsFor(value, units)

设置动态版本的缓存时长。

componentSelection(action)

componentSelection 块提供规则来过滤或阻止某些组件出现在解析结果中。

deactivateDependencyLocking()

在 Gradle 中停用依赖锁定支持。

dependencySubstitution(action)

配置此配置的依赖替换规则集。action 会接收 DependencySubstitutions 的实例,然后可以使用替换规则进行配置。

disableDependencyVerification()

停用此配置的依赖验证。禁用验证时应始终小心,尤其要避免禁用插件验证,因为插件可能会利用此功能禁用自身的验证。

eachDependency(rule)

添加一个依赖替换规则,该规则在配置解析时对每个依赖项(包括传递依赖项)触发。action 会接收 DependencyResolveDetails 的实例,该实例可用于查找正在解析的依赖项并影响解析过程。示例

enableDependencyVerification()

为此配置启用依赖验证。

failOnChangingVersions()

如果调用此方法,Gradle 将确保没有可变版本参与解析。这可用于在 依赖依赖锁定情况下确保构建的可重现性。

failOnDynamicVersions()

如果调用此方法,Gradle 将确保结果依赖图中使用的是非动态版本。实际上,这意味着如果解析的依赖图包含一个模块,并且参与该模块选择的版本中包含至少一个动态版本,那么如果解析结果可能因该版本选择器而改变,则解析将失败。这可用于在 依赖依赖锁定情况下确保构建的可重现性。

failOnNonReproducibleResolution()

配置 Gradle 在解析结果预计不稳定时(即包含动态版本或可变版本,因此结果可能因构建执行时间而改变)使构建失败。此方法等同于同时调用 ResolutionStrategy.failOnDynamicVersions()ResolutionStrategy.failOnChangingVersions()

failOnVersionConflict()

在冲突情况下,Gradle 默认使用冲突版本中最新的版本。但是,您可以更改此行为。使用此方法将解析配置为在任何版本冲突时立即失败,例如在同一个 Configuration 中存在同一依赖项(组和名称相同)的多个不同版本。检查包括第一级依赖项和传递依赖项。参见下方示例

force(moduleVersionSelectorNotations)

允许强制使用某些依赖项版本,包括传递依赖项。在解析依赖项时,追加新的强制模块以供考虑。

getUseGlobalDependencySubstitutionRules()

Gradle 隐式为整个构建树中的所有配置注册依赖替换规则,以查找其他包含构建中的项目。这些规则默认始终处于活动状态。但在某些情况下,某个配置在解析时应不应用这些规则。例如,如果需要发现一个模块的二进制版本,而该模块也在另一个构建中由一个项目表示。可以使用此属性停用这些全局替换规则。

preferProjectModules()

Gradle 可以纯粹按版本号解决冲突,或优先使用项目依赖项而非二进制依赖项。默认是按版本号

sortArtifacts(sortOrder)

指定解析的制品排序顺序。选项有

脚本块

无脚本块

属性详情

CapabilitiesResolution capabilitiesResolution (只读)

能力解析策略。

ComponentSelectionRules componentSelection (只读)

当前配置的版本选择规则对象。

DependencySubstitutions dependencySubstitution (只读)

为此配置设置的依赖替换规则集。

Set<ModuleVersionSelector> forcedModules

返回当前配置的强制模块。有关强制版本的更多信息,请参阅 ResolutionStrategy.force(java.lang.Object[])

方法详情

ResolutionStrategy activateDependencyLocking()

在 Gradle 中激活依赖锁定支持。一旦为配置启用,解析结果就可以保存并在后续构建中重复使用。这使得在使用动态版本时能够实现可重现的构建。

void cacheChangingModulesFor(int value, String units)

设置可变模块的缓存时长,单位以字符串表示。

这是一个方便方法,等同于 ResolutionStrategy.cacheChangingModulesFor(int, java.util.concurrent.TimeUnit),单位以字符串表示。单位通过调用 TimeUnitvalueOf(String) 方法,使用大写的字符串值来解析。

void cacheChangingModulesFor(int value, TimeUnit units)

设置可变模块的缓存时长。

Gradle 缓存可变模块的内容和制品。默认情况下,这些缓存值保留 24 小时,之后缓存条目过期,模块将再次解析。

使用此方法提供自定义过期时间,此时间之后任何可变模块的缓存条目将过期。

void cacheDynamicVersionsFor(int value, String units)

设置动态版本的缓存时长,单位以字符串表示。

这是一个方便方法,等同于 ResolutionStrategy.cacheDynamicVersionsFor(int, java.util.concurrent.TimeUnit),单位以字符串表示。单位通过调用 TimeUnitvalueOf(String) 方法,使用大写的字符串值来解析。

void cacheDynamicVersionsFor(int value, TimeUnit units)

设置动态版本的缓存时长。

Gradle 会缓存动态版本 => 已解析版本(例如 2.+ => 2.3)。默认情况下,这些缓存值保留 24 小时,之后缓存条目过期,动态版本将再次解析。

使用此方法提供自定义过期时间,此时间之后任何动态版本的缓存值将过期。

ResolutionStrategy componentSelection(Action<? super ComponentSelectionRules> action)

componentSelection 块提供规则来过滤或阻止某些组件出现在解析结果中。

ResolutionStrategy deactivateDependencyLocking()

在 Gradle 中停用依赖锁定支持。

ResolutionStrategy dependencySubstitution(Action<? super DependencySubstitutions> action)

配置此配置的依赖替换规则集。action 会接收 DependencySubstitutions 的实例,然后可以使用替换规则进行配置。

示例

// add dependency substitution rules
configurations.all {
  resolutionStrategy.dependencySubstitution {
    // Substitute project and module dependencies
    substitute module('org.gradle:api') using project(':api')
    substitute project(':util') using module('org.gradle:util:3.0')

    // Substitute one module dependency for another
    substitute module('org.gradle:api:2.0') using module('org.gradle:api:2.1')
  }
}

ResolutionStrategy disableDependencyVerification()

停用此配置的依赖验证。禁用验证时应始终小心,尤其要避免禁用插件验证,因为插件可能会利用此功能禁用自身的验证。

ResolutionStrategy eachDependency(Action<? super DependencyResolveDetails> rule)

添加一个依赖替换规则,该规则在配置解析时对每个依赖项(包括传递依赖项)触发。action 会接收 DependencyResolveDetails 的实例,该实例可用于查找正在解析的依赖项并影响解析过程。示例

configurations {
  compileClasspath.resolutionStrategy {
    eachDependency { DependencyResolveDetails details ->
      //specifying a fixed version for all libraries with 'org.gradle' group
      if (details.requested.group == 'org.gradle') {
        details.useVersion '1.4'
      }
    }
    eachDependency { details ->
      //multiple actions can be specified
      if (details.requested.name == 'groovy-all') {
         //changing the name:
         details.useTarget group: details.requested.group, name: 'groovy', version: details.requested.version
      }
    }
  }
}

规则按声明顺序评估。规则在应用强制模块后评估(参见 ResolutionStrategy.force(java.lang.Object[]))。

ResolutionStrategy enableDependencyVerification()

为此配置启用依赖验证。

ResolutionStrategy failOnChangingVersions()

如果调用此方法,Gradle 将确保没有可变版本参与解析。这可用于在 依赖依赖锁定情况下确保构建的可重现性。

ResolutionStrategy failOnDynamicVersions()

如果调用此方法,Gradle 将确保结果依赖图中使用的是非动态版本。实际上,这意味着如果解析的依赖图包含一个模块,并且参与该模块选择的版本中包含至少一个动态版本,那么如果解析结果可能因该版本选择器而改变,则解析将失败。这可用于在 依赖依赖锁定情况下确保构建的可重现性。

ResolutionStrategy failOnNonReproducibleResolution()

配置 Gradle 在解析结果预计不稳定时(即包含动态版本或可变版本,因此结果可能因构建执行时间而改变)使构建失败。此方法等同于同时调用 ResolutionStrategy.failOnDynamicVersions()ResolutionStrategy.failOnChangingVersions()

ResolutionStrategy failOnVersionConflict()

在冲突情况下,Gradle 默认使用冲突版本中最新的版本。但是,您可以更改此行为。使用此方法将解析配置为在任何版本冲突时立即失败,例如在同一个 Configuration 中存在同一依赖项(组和名称相同)的多个不同版本。检查包括第一级依赖项和传递依赖项。参见下方示例

plugins {
    id 'java' // so that there are some configurations
}

configurations.all {
  resolutionStrategy.failOnVersionConflict()
}

ResolutionStrategy force(Object... moduleVersionSelectorNotations)

允许强制使用某些依赖项版本,包括传递依赖项。在解析依赖项时,追加新的强制模块以供考虑。

它接受以下表示法

  • 格式为 'group:name:version' 的字符串,例如:'org.gradle:gradle-core:1.0'
  • ModuleVersionSelector 的实例
  • 以上任何集合或数组都将自动展平

示例

plugins {
    id 'java' // so that there are some configurations
}

configurations.all {
  resolutionStrategy.force 'asm:asm-all:3.3.1', 'commons-io:commons-io:1.4'
}

Property<Boolean> getUseGlobalDependencySubstitutionRules()

Gradle 隐式为整个构建树中的所有配置注册依赖替换规则,以查找其他包含构建中的项目。这些规则默认始终处于活动状态。但在某些情况下,某个配置在解析时应不应用这些规则。例如,如果需要发现一个模块的二进制版本,而该模块也在另一个构建中由一个项目表示。可以使用此属性停用这些全局替换规则。

void preferProjectModules()

Gradle 可以纯粹按版本号解决冲突,或优先使用项目依赖项而非二进制依赖项。默认是按版本号

这适用于第一级和传递依赖项。参见下方示例

plugins {
    id 'java' // so that there are some configurations
}

configurations.all {
  resolutionStrategy.preferProjectModules()
}

void sortArtifacts(SortOrder sortOrder)

指定解析的制品排序顺序。选项有

  • <UNHANDLED-LINK>SortOrder#DEFAULT</UNHANDLED-LINK> : 不指定排序顺序。Gradle 将按默认顺序提供制品。
  • <UNHANDLED-LINK>SortOrder#CONSUMER_FIRST</UNHANDLED-LINK> : 消费组件的制品应出现在其依赖项的制品之前
  • <UNHANDLED-LINK>SortOrder#DEPENDENCY_FIRST</UNHANDLED-LINK> : 消费组件的制品应出现在其依赖项的制品之后

将尽力根据提供的 SortOrder 对制品进行排序,但在存在依赖循环的情况下不作保证。注意:对于特定的 Gradle 版本,制品的排序将保持一致。对相同输入进行多次解析将得到相同顺序的相同输出。