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 版本,工件排序将是一致的。对相同输入的多次解析将导致相同的输出,并保持相同的顺序。