Java Gradle-如果项目仍然具有快照依赖项,则引发异常

Java Gradle-如果项目仍然具有快照依赖项,则引发异常,java,.net,gradle,groovy,Java,.net,Gradle,Groovy,如果当前项目仍然具有快照依赖项,我想使gradle构建失败 到目前为止,我的代码只查找java依赖项,缺少.NET依赖项,因此它只适用于java项目。我想让它适用于所有项目 def addSnapshotCheckingTask(Project project) { project.tasks.withType(JavaCompile) { compileJava -> project.tasks.create(compileJava.name + 'Snapsho

如果当前项目仍然具有快照依赖项,我想使gradle构建失败

到目前为止,我的代码只查找java依赖项,缺少.NET依赖项,因此它只适用于java项目。我想让它适用于所有项目

def addSnapshotCheckingTask(Project project) {
    project.tasks.withType(JavaCompile) { compileJava ->
        project.tasks.create(compileJava.name + 'SnapshotChecking', {
            onlyIf {
                project.ext.isRelease || project.ext.commitVersion != null
            }
            compileJava.dependsOn it
            doLast {
                def snapshots = compileJava.classpath
                        .filter { project.ext.isRelease || !(it.path ==~ /(?i)${project.rootProject.projectDir.toString().replace('\\', '\\\\')}.*build.libs.*/) }
                        .filter { it.path =~ /(?i)-SNAPSHOT/  }
                        .collect { it.name }
                        .unique()
                if (!snapshots.isEmpty()) {
                    throw new GradleException("Please get rid of snapshots for following dependencies before releasing $snapshots")
                }
            }
        })
    }
}
我需要一些帮助来将这个代码段泛化为适用于所有类型的依赖项(不仅仅是java)

谢谢

L.E.像这样的工作可以吗? 类似于

Collection<ResolvedArtifact> snapshotArtifacts = project.configurations*.resolvedConfiguration.resolvedArtifacts.filter { it.moduleVersion.id.version.endsWith('-SNAPSHOT') }
if (!snapshotArtifacts.empty) {
   // throw exception
}
Collection SNAPSHOT artifacts=project.configurations*.resolvedConfiguration.resolvedArtifacts.filter{it.moduleVersion.id.version.endsWith('-SNAPSHOT')}
如果(!snapshotArtifacts.empty){
//抛出异常
}

因此,我通过稍微调整@lance java的响应来实现它,它看起来像:

    Task snapshotCheckingTask = project.tasks.create('snapshotCheckingTask', {
        doLast {
            def snapshots = new ArrayList()
            def projectConfigurations = project.configurations.findAll { true }

            projectConfigurations.each {
                if (it.isCanBeResolved()) {
                    it.resolvedConfiguration.resolvedArtifacts.each {
                        if (it.moduleVersion.id.version.endsWith('-SNAPSHOT')) {
                            snapshots.add(it)
                        }
                    }
                }
            }
            if (!snapshots.isEmpty()) {
                throw new GradleException("Please get rid of snapshots for following dependencies before releasing $snapshots")
            } else {
                throw new GradleException("Hah, no snapshots!")
            }
        }
    })
    project.tasks.release.dependsOn snapshotCheckingTask
cc@Eugene


不过,这并没有考虑到.net依赖关系

这是个好问题!!!我们需要这个已经有一段时间了,但是我没有时间去看,对解决方案非常感兴趣,在下面添加了一个响应,请查看它,谢谢,我今天将测试这个!谢谢不幸的是,使用这个代码片段我得到了这样的结论:不允许直接解析配置“apilements”
apilements
configuration依赖于另一个任务。要测试该理论,您可以每隔一个任务执行一次*SnapshotChecking任务
dependsOn
。您还可以尝试将
inputs.files project.configurations
添加到任务声明中,gradle可能会为您连接DAG。我刚刚添加了检查if(it.isCanBeResolved())以排除无法解决的配置。这似乎是gradle 4.0或类似于groovy中引入的一个突破性的更改。您可以在groovy中编写
it.isCanBeResolved()
as
it.canBeResolved
哇,谢谢!Groovy在可读性方面比Java要好得多。它将它改写为一种更具功能性的样式:
def snapshots=project.configurations.findAll{it.canBeResolved}.resolvedConfiguration.resolvedArtifacts.flatte().findAll{it.moduleVersion.id.version.endsWith('-SNAPSHOT')}.unique()