如何在Gradle build的已发布ivy.xml中获取动态依赖项的rev和revConstraint
我有一个关于格拉德尔常春藤出版社的问题 从Ivy开始,我希望如果我发布一个工件,例如,具有这种依赖性:如何在Gradle build的已发布ivy.xml中获取动态依赖项的rev和revConstraint,gradle,Gradle,我有一个关于格拉德尔常春藤出版社的问题 从Ivy开始,我希望如果我发布一个工件,例如,具有这种依赖性: <dependency org="org.apache.ant" name="ant" rev="1+"/> 如果我运行gradleuploadarchives生成的ivy.xml只有以下内容: <dependency org="org.apache.ant" name="ant" rev="1+" conf="compile->default"/>
<dependency org="org.apache.ant" name="ant" rev="1+"/>
如果我运行gradleuploadarchives
生成的ivy.xml只有以下内容:
<dependency org="org.apache.ant" name="ant" rev="1+" conf="compile->default"/>
在中,我确实看到有一种编写rev和revConstraint的工具:
if (!dep.getDynamicConstraintDependencyRevisionId().equals(dependencyRevisionId)) {
<...>
writer.attribute("revConstraint", dep.getDynamicConstraintDependencyRevisionId().getRevision());
}
如果(!dep.getDynamicConstraintDependencyRevisionId().等于(dependencyRevisionId)){
属性(“revConstraint”,dep.getDynamicConstraintDependencyRevisionId().getRevision());
}
通过调试,我还看到这段代码被命中,但是,在我的例子中,getDynamicConstraintDependencyRevisionId和dependencyRevisionId在这一点上都给出了“1+”,而1.9.6版本在这一点上被遗忘了
如何才能像在ivy中一样,将依赖项版本记录在已发布的ivy.xml中?不确定这是否有任何帮助。但我最近不得不解决一个类似的问题,并提出了以下方法。希望它能帮助其他人寻找解决方案。我是根据RaGe的和的线索得出这个答案的 我必须实现这一点的原因是,gradle发布的常春藤具有rev属性,但没有revConstraint属性。但是rev总是说“最新的.版本”,这是我们内部库所使用的。所以我不得不手动将rev设置为实际版本,将revConstraint设置为最新版本
publishing {
publications {
ivyJava(IvyPublication) {
from components.java
configurations.create('sources')
artifact(sourceJar) {
type "source"
conf "sources"
classifier "sources"
}
configurations.create('javadoc')
artifact(javadocJar) {
type "javadoc"
conf "javadoc"
classifier "javadoc"
}
descriptor {
withXml {
if (project.configurations.findByName("runtime") != null) {
Map resolvedVersionMap = [:]
Configuration runtimeConfiguration = project.configurations.getByName('runtime')
ResolutionResult resolution = runtimeConfiguration.incoming.resolutionResult
resolution.getAllComponents().each { ResolvedComponentResult versionResult ->
resolvedVersionMap.put("${versionResult.moduleVersion.group}:" +
":${versionResult.moduleVersion.name}", versionResult.moduleVersion.version)
}
asNode().dependencies.dependency.each { dep ->
if ("latest.release".equalsIgnoreCase(dep.@rev) || "latest.integration".equalsIgnoreCase(dep.@rev)
|| "latest.snapshot".equalsIgnoreCase(dep.@rev)) {
dep.@revConstraint = dep.@rev
dep.@rev = resolvedVersionMap.get("${dep.@org}:" +
":${dep.@name}")
dep.@changing = "true"
}
}
}
}
}
}
}
}较新的
ivy publish
插件也存在同样的问题,在编写ivy.xml
之前,已解决的版本会被删除。一些答案试图将已解决的版本破解成生成的mavenpom.xml
,你也可以做类似于修改ivy.xml
的事情。如果你想让我尝试一下,请告诉我。
if (!dep.getDynamicConstraintDependencyRevisionId().equals(dependencyRevisionId)) {
<...>
writer.attribute("revConstraint", dep.getDynamicConstraintDependencyRevisionId().getRevision());
}
publishing {
publications {
ivyJava(IvyPublication) {
from components.java
configurations.create('sources')
artifact(sourceJar) {
type "source"
conf "sources"
classifier "sources"
}
configurations.create('javadoc')
artifact(javadocJar) {
type "javadoc"
conf "javadoc"
classifier "javadoc"
}
descriptor {
withXml {
if (project.configurations.findByName("runtime") != null) {
Map resolvedVersionMap = [:]
Configuration runtimeConfiguration = project.configurations.getByName('runtime')
ResolutionResult resolution = runtimeConfiguration.incoming.resolutionResult
resolution.getAllComponents().each { ResolvedComponentResult versionResult ->
resolvedVersionMap.put("${versionResult.moduleVersion.group}:" +
":${versionResult.moduleVersion.name}", versionResult.moduleVersion.version)
}
asNode().dependencies.dependency.each { dep ->
if ("latest.release".equalsIgnoreCase(dep.@rev) || "latest.integration".equalsIgnoreCase(dep.@rev)
|| "latest.snapshot".equalsIgnoreCase(dep.@rev)) {
dep.@revConstraint = dep.@rev
dep.@rev = resolvedVersionMap.get("${dep.@org}:" +
":${dep.@name}")
dep.@changing = "true"
}
}
}
}
}
}
}