【问题标题】:Reuse Gradle build script in other projects在其他项目中重用 Gradle 构建脚本
【发布时间】:2017-04-20 02:26:31
【问题描述】:

假设我有:

  • 项目 A 包含一个 build.gradle 脚本,该脚本应用另一个脚本 build-A.gradle 包含一堆任务
  • 我想使用 build-A.gradle 中的任务的项目 B

build-A.gradle 看起来像这样:

task someTask << {
   // do stuff
}

似乎解决方案是创建一个独立的自定义 Gradle 插件,所以我为此创建了项目 C。它包含复制粘贴的 build-A.gradle 脚本和使用 apply(Project project) 方法扩展插件的 MyPlugin 类。

  1. 有什么方法可以从 MyPlugin 引用我的 build-A.gradle 中声明的任务?
  2. 如果没有,我如何将我的脚本“转换”为任务类?例如。如何从类中获取configurationsant 等属性?

【问题讨论】:

    标签: gradle groovy


    【解决方案1】:

    有什么方法可以引用我的 build-A.gradle 中声明的任务 我的插件?

    既然您已经创建了 ProjectC,您可以将 build-A.gradle 放在 ProjectC/src/main/resources/build-A.gradle 中,以便将其打包在插件 jar 中并在类路径中可用。然后你可以在ProjectC/src/main/groovy/.../MyPlugin.groovy中执行以下操作

    class MyPlugin implements Plugin<Project> {
        void apply(Project project) {
            applyFromClasspath(project, 'build-A.gradle')
        }
    
        void applyFromClasspath(Project project, String path) {
            InputStream in = getClass().classloader.getResourceAsStream(path)
            if (in == null) throw new RuntimeException("No such resource $path")
            in.withStream { InputStream stream ->
                File localFile = project.file("${project.buildDir}/MyPlugin/$path")
                localFile.parentFile.mkdirs()
                localFile.bytes = stream.bytes
            }
            project.apply(from: localFile)
        }
    }
    

    如何获取配置、ant 等属性 上课?

    这些可从Project 实例获得(例如project.configurationsproject.ant 等)。 Project 对象隐含在 build.gradle 文件中,因此 configurations 将委托给 project.configurations 等。如果您想在插件中使用相同的对象,可以使用 project.with { ... }。例如:

    void apply(Project project) {
        project.with {
            configurations { ... }
            ant.echo(message: 'Hello')
        }
    }
    

    @见Object.with(Closure)

    【讨论】:

      猜你喜欢
      • 2021-06-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-03
      • 2015-08-08
      • 1970-01-01
      • 1970-01-01
      • 2022-10-09
      相关资源
      最近更新 更多