定义了围绕依赖解析的策略。例如,强制使用某些依赖版本、替换、冲突解决或快照超时。
示例
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 | 返回当前配置的强制模块。有关强制版本的更多信息,请参阅 |
方法 | 描述 |
activateDependencyLocking() | 在 Gradle 中激活依赖锁定支持。一旦为配置启用,解析结果就可以保存并在后续构建中重复使用。这使得在使用动态版本时能够实现可重现的构建。 |
cacheChangingModulesFor(value, units) | 设置可变模块的缓存时长,单位以字符串表示。 |
cacheChangingModulesFor(value, units) | 设置可变模块的缓存时长。 |
cacheDynamicVersionsFor(value, units) | 设置动态版本的缓存时长,单位以字符串表示。 |
cacheDynamicVersionsFor(value, units) | 设置动态版本的缓存时长。 |
componentSelection(action) | componentSelection 块提供规则来过滤或阻止某些组件出现在解析结果中。 |
deactivateDependencyLocking() | 在 Gradle 中停用依赖锁定支持。 |
dependencySubstitution(action) | 配置此配置的依赖替换规则集。action 会接收 |
disableDependencyVerification() | 停用此配置的依赖验证。禁用验证时应始终小心,尤其要避免禁用插件验证,因为插件可能会利用此功能禁用自身的验证。 |
eachDependency(rule) | 添加一个依赖替换规则,该规则在配置解析时对每个依赖项(包括传递依赖项)触发。action 会接收 |
enableDependencyVerification() | 为此配置启用依赖验证。 |
failOnChangingVersions() | 如果调用此方法,Gradle 将确保没有可变版本参与解析。这可用于在 不依赖依赖锁定的情况下确保构建的可重现性。 |
failOnDynamicVersions() | 如果调用此方法,Gradle 将确保结果依赖图中使用的是非动态版本。实际上,这意味着如果解析的依赖图包含一个模块,并且参与该模块选择的版本中包含至少一个动态版本,那么如果解析结果可能因该版本选择器而改变,则解析将失败。这可用于在 不依赖依赖锁定的情况下确保构建的可重现性。 |
failOnNonReproducibleResolution() | 配置 Gradle 在解析结果预计不稳定时(即包含动态版本或可变版本,因此结果可能因构建执行时间而改变)使构建失败。此方法等同于同时调用 |
failOnVersionConflict() | 在冲突情况下,Gradle 默认使用冲突版本中最新的版本。但是,您可以更改此行为。使用此方法将解析配置为在任何版本冲突时立即失败,例如在同一个 |
force(moduleVersionSelectorNotations) | 允许强制使用某些依赖项版本,包括传递依赖项。在解析依赖项时,追加新的强制模块以供考虑。 |
getUseGlobalDependencySubstitutionRules() | Gradle 隐式为整个构建树中的所有配置注册依赖替换规则,以查找其他包含构建中的项目。这些规则默认始终处于活动状态。但在某些情况下,某个配置在解析时应不应用这些规则。例如,如果需要发现一个模块的二进制版本,而该模块也在另一个构建中由一个项目表示。可以使用此属性停用这些全局替换规则。 |
preferProjectModules() | Gradle 可以纯粹按版本号解决冲突,或优先使用项目依赖项而非二进制依赖项。默认是按版本号。 |
sortArtifacts(sortOrder) | 指定解析的制品排序顺序。选项有 |
CapabilitiesResolution
capabilitiesResolution
(只读)
能力解析策略。
ComponentSelectionRules
componentSelection
(只读)
当前配置的版本选择规则对象。
DependencySubstitutions
dependencySubstitution
(只读)
为此配置设置的依赖替换规则集。
Set
<ModuleVersionSelector
>
forcedModules
Set
<ModuleVersionSelector
>返回当前配置的强制模块。有关强制版本的更多信息,请参阅 ResolutionStrategy.force(java.lang.Object[])
ResolutionStrategy
activateDependencyLocking
()
在 Gradle 中激活依赖锁定支持。一旦为配置启用,解析结果就可以保存并在后续构建中重复使用。这使得在使用动态版本时能够实现可重现的构建。
void
cacheChangingModulesFor
(int
value, String
units)
设置可变模块的缓存时长,单位以字符串表示。
这是一个方便方法,等同于 ResolutionStrategy.cacheChangingModulesFor(int, java.util.concurrent.TimeUnit)
,单位以字符串表示。单位通过调用 TimeUnit
的 valueOf(String)
方法,使用大写的字符串值来解析。
void
cacheChangingModulesFor
(int
value, TimeUnit
units)
设置可变模块的缓存时长。
Gradle 缓存可变模块的内容和制品。默认情况下,这些缓存值保留 24 小时,之后缓存条目过期,模块将再次解析。
使用此方法提供自定义过期时间,此时间之后任何可变模块的缓存条目将过期。
void
cacheDynamicVersionsFor
(int
value, String
units)
设置动态版本的缓存时长,单位以字符串表示。
这是一个方便方法,等同于 ResolutionStrategy.cacheDynamicVersionsFor(int, java.util.concurrent.TimeUnit)
,单位以字符串表示。单位通过调用 TimeUnit
的 valueOf(String)
方法,使用大写的字符串值来解析。
void
cacheDynamicVersionsFor
(int
value, TimeUnit
units)
设置动态版本的缓存时长。
Gradle 会缓存动态版本 => 已解析版本(例如 2.+ => 2.3)。默认情况下,这些缓存值保留 24 小时,之后缓存条目过期,动态版本将再次解析。
使用此方法提供自定义过期时间,此时间之后任何动态版本的缓存值将过期。
ResolutionStrategy
componentSelection
(Action
<? super ComponentSelectionRules
>
action)
Action
<? super ComponentSelectionRules
>componentSelection 块提供规则来过滤或阻止某些组件出现在解析结果中。
ResolutionStrategy
deactivateDependencyLocking
()
在 Gradle 中停用依赖锁定支持。
ResolutionStrategy
dependencySubstitution
(Action
<? super DependencySubstitutions
>
action)
Action
<? super DependencySubstitutions
>配置此配置的依赖替换规则集。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
<? super DependencyResolveDetails
>添加一个依赖替换规则,该规则在配置解析时对每个依赖项(包括传递依赖项)触发。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)
Object
...允许强制使用某些依赖项版本,包括传递依赖项。在解析依赖项时,追加新的强制模块以供考虑。
它接受以下表示法
- 格式为 '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' }
Gradle 隐式为整个构建树中的所有配置注册依赖替换规则,以查找其他包含构建中的项目。这些规则默认始终处于活动状态。但在某些情况下,某个配置在解析时应不应用这些规则。例如,如果需要发现一个模块的二进制版本,而该模块也在另一个构建中由一个项目表示。可以使用此属性停用这些全局替换规则。
Gradle 可以纯粹按版本号解决冲突,或优先使用项目依赖项而非二进制依赖项。默认是按版本号。
这适用于第一级和传递依赖项。参见下方示例
plugins { id 'java' // so that there are some configurations } configurations.all { resolutionStrategy.preferProjectModules() }
指定解析的制品排序顺序。选项有
- <UNHANDLED-LINK>SortOrder#DEFAULT</UNHANDLED-LINK> : 不指定排序顺序。Gradle 将按默认顺序提供制品。
- <UNHANDLED-LINK>SortOrder#CONSUMER_FIRST</UNHANDLED-LINK> : 消费组件的制品应出现在其依赖项的制品之前。
- <UNHANDLED-LINK>SortOrder#DEPENDENCY_FIRST</UNHANDLED-LINK> : 消费组件的制品应出现在其依赖项的制品之后。
将尽力根据提供的 SortOrder
对制品进行排序,但在存在依赖循环的情况下不作保证。注意:对于特定的 Gradle 版本,制品的排序将保持一致。对相同输入进行多次解析将得到相同顺序的相同输出。