如何使用Gradle Distribution插件挑选ZIP内容?

时间:2014-09-20 16:41:07

标签: plugins configuration gradle zip

My Gradle构建当前在我的项目根目录下的build目录下生成以下目录结构:

myapp/
    src/
    build.gradle
    build/
        docs/
            groovydoc/* (all Groovydocs)
        libs/
            myapp-SNAPSHOT.jar
            myapp-SNAPSHOT-sources.jar
        reports/
            codenarc/
                main.html
        test-results/* (JUnit test results)

我想添加distribution plugin(或任何可以实现我目标的东西),让Gradle生成一个具有以下目录结构的ZIP文件:

myapp-SNAPSHOT-buildreport.zip/
    tests/
        (JUnit tests from build/test-results above)
    reports/
        main.html (CodeNarc report from build/reports/codenarc above)
    api/
        (Groovydocs from build/docs above)
    source/
        myapp-SNAPSHOT-sources.jar (from build/libs above)
    bin/
        myapp-SNAPSHOT.jar (from build/libs above)

阅读插件的文档后,我无法告诉如何配置它以满足这些需求。很明显我需要运行gradle distZip,但至于如何实际配置它以产生所需的目录结构,它似乎没有提供任何文档/示例。有什么想法吗?

注意:JAR的版本显然是SNAPSHOT,并使用-Pversion=SNAPSHOT命令行参数传递给Gradle构建。

3 个答案:

答案 0 :(得分:7)

我可能不会使用分发插件而只是创建一个新的自定义Zip任务。它看起来像这样:

task buildreportZip(type: Zip, dependsOn: build) {
    classifier = 'buildreport'

    from('build/test-results') {
        into 'tests'
    }

    from('build/reports/codenarc') {
        into 'reports'
    }

    from('build/docs') {
        into 'api'
    }

    from(sourcesJar) { // or whatever you source jar task name is
        into 'source'
    }

    from(jar) {
        into 'bin'
    }
}

答案 1 :(得分:6)

Gradle Distribution plugin 会自动拥有默认值(问题是文档没有告诉我们默认值,但Gradle项目的默认结构是假定的)所以如果您的Gradle项目非常简单并且已经使用src/main/groovysrc/main/java,您通常只需... {/ p>

使用CopySpec反转模式,为您的into{}(制作目录)提供from{}的内容,而不是相反,如下所示:

apply plugin: 'groovy'
apply plugin: 'eclipse'
apply plugin: 'application'

distributions {
    main {
        baseName= 'vz_sde_dm'
        contents {
            into('bin/config') {
                from 'config'
            }
            into('lib/samples') {
                from 'samples'
            }
        }
    }
}

请注意,我不需要为from{}定义contents{},而只需要into{}s,因为我已经使用默认的Gradle Groovy项目布局,只添加了2个额外的文件夹( config& samples)在我的Eclipse项目中,但与我的常规构建文件夹布局相比,我需要将这两个文件夹放入稍微不同的层次结构中。

答案 2 :(得分:0)

我也试图制作自定义布局,但在弄清楚如何从 yourProject.zip/yourProject/lib 目录中的 build/libs 中排除项目输出(并排除一般的东西)并将其放入时遇到了真正的麻烦进入 yourProject.zip/yourProject。

经过数天在 API 中搜索和摸索的数小时后,我终于找到了使用 Distribution 的实际配置和底层 CopySpec(记录为 herehere,分别为Gradle 5.6.1,您可以在 URL 中将 5.6.1 替换为 current 以获得最新的 API 文档,5.6.1 恰好是我正在使用的版本):

distributions {
    main {
        baseName = appName

        contents {
            filesMatching("**/${appName}.jar", {
                if (it.getPath().contains('/lib/')) {
                    it.setPath(it.getPath().replace('lib/', ''))
                }
            })

            into('config') {
                exclude(['server.crt', 'spotbugs-exclusion-filters.xml'])
                from 'src/main/resources'
            }
        }
    }
}

对于排除,唯一有效的方法是匹配 glob 模式并通过主发行版内容 CopySpec 的 filesMatching 方法使用闭包指定正确的操作(将其复制到根 dist 目录而不是 root/lib)。您还可以看到配置的目的地是如何从根目录更改为根目录/config 目录的。也感谢 Thad 的回答,帮助指导我进行正确的构建配置。