在Gradle中,如何生成具有动态依赖关系的POM文件,该文件已解析为所使用的实际版本?
在Gradle中,如何生成具有动态依赖关系的POM文件,该文件已解析为所使用的实际版本?
dependencies { testCompile(group: 'junit', name: 'junit', version: '4.+') }
这是从上面的依赖项生成的。
junit junit 4.+ test
我希望将+
解析为如下的应计版本。
junit junit 4.12 test
关于Maven Publishing的Gradle指南章节讨论了这样做,但没有提到如何做。
使用此挂钩,您可以修改POM的任何方面。 例如,您可以使用用于生成构建的实际版本替换依赖项的版本范围。
解
使用Peter Niederwieser的答案中的信息,我创建了一个任务,该任务读取包含动态依赖关系的POM,并使用已解析依赖关系的新pom覆盖它。
/** * Reads and Overwrites POM file resolving dynamic dependencies */ task cleanPom(dependsOn: writeNewPom) << { // Get existing pom file Node xml = new XmlParser().parse(pomFileLocation) // Generate map of resolved versions Map resolvedVersionMap = new HashMap() Set resolvedArtifacts = configurations.compile.getResolvedConfiguration().getResolvedArtifacts() resolvedArtifacts.addAll(configurations.testCompile.getResolvedConfiguration().getResolvedArtifacts()) resolvedArtifacts.each { resolvedVersionMap.put(it.getName(), it.getModuleVersion().getId().getVersion()) } // Update dependencies with resolved versions xml.dependencies.first().each { Node artifactId = it.get("artifactId").first() def artifactName = artifactId.value().first() def artifactVersion = resolvedVersionMap.get(artifactName) Node version = it.get("version").first() version.value = artifactVersion } // Overwrite existing pom file new XmlNodePrinter(new PrintWriter(new FileWriter(pomFileLocation))).print(xml) }
需要一些努力才能编写代码。 两个主要部分是:
- 使用
Configuration#getIncoming
或Configuration#getResolvedConfiguration
API查询已解析的版本 - 使用Groovy的
XMlParser
API操作POM(假设使用了新的maven-publish
插件)
有关Configuration
API的信息可以在Gradle Build Language Reference中找到 ,它可以进一步链接到Javadoc。 完整的Gradle分布包含一个演示POM操作的小样本 。 有关XmlParser
信息可以在Groovy文档中找到。
我已经尝试将它集成到一个可以应用的插件中,具体代码可以在这里找到: https : //github.com/nebula-plugins/nebula-publishing-plugin/blob/master/src/main/常规/星云/插件/出版/行家/ ResolvedMavenPlugin.groovy
它可以通过jcenter()通过’com.netflix.nebula:nebula-publishing-plugin:1.9.1’包含在内。
Peter建议的pom.withXml()
解决方案如下所示:
publishing { publications { mavenCustom(MavenPublication) { from components.java pom.withXml { // Generate map of resolved versions Map resolvedVersionMap = [:] Set resolvedArtifacts = configurations.compile.getResolvedConfiguration().getResolvedArtifacts() resolvedArtifacts.addAll(configurations.testCompile.getResolvedConfiguration().getResolvedArtifacts()) resolvedArtifacts.each { ModuleVersionIdentifier mvi = it.getModuleVersion().getId(); resolvedVersionMap.put("${mvi.getGroup()}:${mvi.getName()}", mvi.getVersion()) } // Update dependencies with resolved versions def hasDependencies = !asNode().dependencies.isEmpty() if (hasDependencies) { asNode().dependencies.first().each { def groupId = it.get("groupId").first().value().first() def artifactId = it.get("artifactId").first().value().first() it.get("version").first().value = resolvedVersionMap.get("${groupId}:${artifactId}") } } } } }