我们有一个模块化项目,依赖关系如下所示
核心
level_1-app 取决于 核心
level_2-app 取决于 level_1-app
level_3_1-app 取决于 level_2-app level_3_2-app 取决于 level_2-app level_3_3-app 取决于 level_2-app level_3_4-app 取决于 level_2-app
facade-app 取决于 level_3_1-app、level_3_2-app、level_3_3-app、level_3_4-app 我们仍然没有任何模块的 semver 版本控制,因此目前我们决定所有项目的传递版本应该始终相同(我的意思只是我们的项目。对于其他库,我们不希望有这种限制)。
在 facade-app 上,我们要检查所有传递依赖项是否具有相同版本的 core、level_1-app 和 level_2-app。如果不是 - 构建应该失败或至少发出警告。
是否有任何 gradle 插件可以做到这一点,或者我们应该实现自己的插件?
这并不完美,但这大致就是我的方法
// In facade-app's build.gradle
def enforcedModules = ['core', 'level_1-app', 'level_2-app']
def moduleVersions = [:]
configurations.all { config ->
// Check only resolvable configurations
if (config.canBeResolved) {
config.incoming.afterResolve { resolvableDependencies ->
resolvableDependencies.resolutionResult.allDependencies { dep ->
def selectedId = dep.selected.id
// Ensure we have a module dependency
if (selectedId instanceof ModuleComponentIdentifier) {
def moduleName = selectedId.module
if (enforcedModules.contains(moduleName)) {
def version = selectedId.version
if (!moduleVersions.containsKey(moduleName)) {
// Store the version if encountering the module for the first time
moduleVersions[moduleName] = version
} else if (moduleVersions[moduleName] != version) {
// Fail the build if a version mismatch is detected
throw new GradleException("Version mismatch detected for '${moduleName}'. Versions used: '${moduleVersions[moduleName]}' and '${version}'")
}
}
}
}
}
}
}