【问题标题】:Creating combined distribution for composite Gradle build为复合 Gradle 构建创建组合分布
【发布时间】:2022-01-17 05:52:55
【问题描述】:

我有一个模块化的 Java 项目,它结合了库和 CLI 工具:

  • cli-工具/
    • 创建补丁
    • 发现冲突
  • 模块/
    • 核心
    • 分析

我正在尝试从 cli-tools 项目创建一个组合发行版,其中包含所有依赖项 jar 和由 application 插件生成的所有启动脚本。我已经使构建依赖项正常工作,并且包含了我的本地 jar,但未包含启动脚本,runtimeClasspaths 中也没有任何内容。我的日志语句显示任何子项目上都没有插件,即使它们的任务正在执行,所以也许我检查插件的方法是错误的?

// cli-tools/build.gradle.kts:

tasks.named("distZip").configure {
    subprojects.forEach {
        dependsOn(it.path.plus(":startScripts"))
    }
}

distributions {
    main {
        distributionBaseName.set("patch-tools")
        contents {
            project.subprojects.forEach { sub ->
                val subLibs = sub.buildDir.resolve("libs")
                if (subLibs.exists())
                    into("lib") {
                        from(subLibs)
                    }

                sub.logger.info("plugins of {}: {}", sub.name, sub.plugins)
                if (sub.pluginManager.hasPlugin("application")) {
                    into("lib") {
                        from(sub.configurations.findByName("runtimeClasspath"))
                    }
                    into("bin") {
                        from(sub.buildDir.resolve("scripts"))
                    }

                }
            }
        }
    }
}

我怎样才能让它工作,以便发布脚本和传递依赖项包含在分发中?

【问题讨论】:

    标签: gradle gradle-kotlin-dsl


    【解决方案1】:

    与其尝试从子项目构建目录手动收集子项目分布的各个部分,我建议宁愿让子项目先创建它们的完整分布,然后让父项目将它们组合成一个新分布。这还有一个好处是您不会错过组合发行版中子项目发行版的任何非默认/特殊部分(如文档或其他目录)。

    这就是您的cli-tools/build.gradle.kts 的样子:

    plugins {
        distribution
    }
    
    tasks.named<Zip>("distZip") {
        duplicatesStrategy = DuplicatesStrategy.EXCLUDE
    }
    
    distributions {
        main {
            distributionBaseName.set("patch-tools")
            project.subprojects.forEach { sub ->
                sub.afterEvaluate {
                    tasks.all { task ->
                        if (task.name == "installDist") {
                            contents.from(task)
                        }
                        true
                    }
                }
            }
        }
    }
    

    distZip 任务(通过分布 contents CopySpec)现在自动依赖于子项目的 installDist 任务,并从它们的输出中生成组合分布。

    (使用 Gradle 7.3.2 成功测试)

    【讨论】:

      【解决方案2】:

      我认为这行:

      dependsOn(it.path.plus(":startScripts"))
      

      应该是:

      dependsOn(":startScripts")
      

      ... 因为不能将路径与模块名称混为一谈;也没有可用的子模块。但是,问题并不完全清楚,:startScripts 是任务还是模块。

      【讨论】:

      • 任务依赖项似乎按原样工作,但如果目录名称与模块名称不匹配,它们可能会中断
      猜你喜欢
      • 2018-12-15
      • 1970-01-01
      • 2021-03-31
      • 1970-01-01
      • 2016-05-16
      • 1970-01-01
      • 2012-03-30
      • 2018-05-25
      • 1970-01-01
      相关资源
      最近更新 更多