gradle - 如何在非Java构建中声明项目工件?

标签 gradle

我有包含非Java项目的多项目Gradle构建。

我想声明一个这样的项目创建的 Artifact ,以便可以使用项目/配置依赖关系来获取它们,例如

consumer:
dependencies {
  myConf project(path: ':producer', configuration: 'myConf')
}

我目前所拥有的是:
producer:
configurations {
  myConf
}

task produceFile {
   //... somehow create the file...

   outputs.file file('path/to/file')
}

artifacts.add('myConf', produceFile.outputs.files.singleFile, { builtBy produceFile })

有比我笨拙的版本更好的方法来声明 Artifact 了吗?

我想不出一种将任务依赖项从 Artifact 传递到生产任务的方法。

最佳答案

根据有关Legacy publishing的文档文章和有关 ArtifactHandler 的javadoc的文章,对于您的简单示例,只要任务类型扩展了AbstractArchiveTask(例如ZipJar),只需传递任务就足够了:

artifacts.add('myConf', produceFile)

...或者更像Gradle-ish的方式:
artifacts {
    myConf produceFile
}

上面提到的文章还有另一个示例,其中File直接传递给add方法,该方法要求您以示例中的方式指定任务来构建文件。

但是,让我为可能更“轻巧”的语法提出其他想法:
artifacts {
    myConf files(produceFile).singleFile { buildBy produceFile }
    // or
    myConf file: files(produceFile).singleFile, buildBy: [produceFile]
}

这两个示例使用Project.files(...)方法来解析任务的输出,而不是手动访问它们。第二个示例利用了Gradle通常提供的map语法。

如果您想以某种方式标准化发布自定义 Artifact 的方式,我建议创建一个自定义任务类型,该类型提供ArtifactHandler可以作为方法或属性处理的任何不同参数:
class MyTaskType extends DefaultTask {
    // ... other stuff ... of course this should be part of a plugin
    def getArtifact() {
        return ... // either a (Configurable)PublishArtifact (if constructor is available) or a map representation
    }
}

task produceFile(type: MyTaskType) {
    // configure somehow
}

artifacts {
    myConf produceFile.artifact
}

关于gradle - 如何在非Java构建中声明项目工件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51882103/

相关文章:

java - 如何添加 Artifactory WAR 作为 Gradle 依赖项

android - 我如何从Library Project Android Studio获得 yield

kotlin - 在 Kotlin 项目中使用 Freefair AspectJ 插件(使用 gradle)

java - Android Studio 不会在 "Run"上构建 Java 项目;需要手动构建

gradle - Gradle JVM版本与JDK

android - Android:如何修复Gradle执行错误?

java - 在 groovy 中使用 HTML 格式的 JIRA Rest API 创建发行说明

java - gradle:fileCollection.plus() 返回 ArrayList 矛盾的接口(interface)

android - 在不同文件中配置 Gradle 依赖项

android - 设置显式注释处理器