在 Gradle 中,如何生成具有解析为实际使用版本的动态依赖项的 POM 文件?
dependencies {
testCompile(group: 'junit', name: 'junit', version: '4.+')
}
这是从上面的依赖关系生成的。
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.+</version>
<scope>test</scope>
</dependency>
</dependencies>
我想要拥有+
解决为应计版本,如下所示。
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
</dependencies>
Gradle 指南中的章节梅文出版公司谈论这样做,但没有提及如何做。
使用这个钩子,您可以修改 POM 的任何方面。例如,您可以将依赖项的版本范围替换为用于生成构建的实际版本。
Solution
使用 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<ResolvedArtifact> 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
or Configuration#getResolvedConfiguration
API
- 使用 Groovy 操作 POM
XMlParser
API(假设新的maven-publish
使用插件)
有关信息Configuration
API 可以在Gradle 构建语言参考,进一步链接到 Javadoc。
完整的 Gradle 发行版包含微小样本演示 POM 操作。相关信息XmlParser
可以在 Groovy 文档中找到。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)