如何在Gradle build的已发布ivy.xml中获取动态依赖项的rev和revConstraint

如何在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-&gt;default"/>

我有一个关于格拉德尔常春藤出版社的问题

从Ivy开始,我希望如果我发布一个工件,例如,具有这种依赖性:

<dependency org="org.apache.ant" name="ant" rev="1+"/>
如果我运行
gradleuploadarchives
生成的ivy.xml只有以下内容:

<dependency org="org.apache.ant" name="ant" rev="1+" conf="compile-&gt;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
之前,已解决的版本会被删除。一些答案试图将已解决的版本破解成生成的maven
pom.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"
                        }
                    }
                }
            }
        }
    }
}