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

Gradle 如何在非Java构建中声明项目工件?,gradle,Gradle,我有一个包含非Java项目的多项目Gradle构建 我想声明一个这样的项目创建的工件,我可以使用项目/配置依赖关系来获取它们,例如 consumer: dependencies { myConf project(path: ':producer', configuration: 'myConf') } 我目前拥有的是: producer: configurations { myConf } task produceFile { //... somehow create the

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

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

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 })
有没有比我笨拙的版本更好的方法来声明工件


我无法找到一种方法将任务依赖关系从工件一次传递到生产任务。

根据上的文档文章和上的javadoc,对于您的简单示例,只要任务类型扩展为
AbstractArchiveTask
(例如
Zip
Jar
):

…或者以更渐进的方式:

artifacts {
    myConf produceFile
}
上面提到的文章还有另一个例子,其中一个
文件
直接传递给
add
方法,该方法要求您按照示例中的方式指定构建文件的任务

但是,让我提出一些关于语法的其他想法,这些想法可能更“轻量级”:

artifacts {
    myConf files(produceFile).singleFile { buildBy produceFile }
    // or
    myConf file: files(produceFile).singleFile, buildBy: [produceFile]
}
这两个示例使用
Project.files(…)
方法解析任务的输出,而不是手动访问它们。第二个示例使用Gradle经常提供的映射语法

如果您想以某种方式标准化发布自定义工件的方式,我建议创建一个自定义任务类型,它提供
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
}

根据上的文档文章和上的javadoc,对于您的简单示例,只要任务类型扩展为
AbstractArchiveTask
(例如
Zip
Jar
):

…或者以更渐进的方式:

artifacts {
    myConf produceFile
}
上面提到的文章还有另一个例子,其中一个
文件
直接传递给
add
方法,该方法要求您按照示例中的方式指定构建文件的任务

但是,让我提出一些关于语法的其他想法,这些想法可能更“轻量级”:

artifacts {
    myConf files(produceFile).singleFile { buildBy produceFile }
    // or
    myConf file: files(produceFile).singleFile, buildBy: [produceFile]
}
这两个示例使用
Project.files(…)
方法解析任务的输出,而不是手动访问它们。第二个示例使用Gradle经常提供的映射语法

如果您想以某种方式标准化发布自定义工件的方式,我建议创建一个自定义任务类型,它提供
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
}

感谢您的回答!但是,这似乎只适用于归档任务,这在
ArtifactHandler
()的文档中也有说明其他任务也有这样做的方法吗?我不知道这是声明工件的传统方法-我也会研究新方法,也许我的解决方案就在那里。好的,很抱歉我没有注意到文档的这一部分。我编辑了我的答案并添加了更多的想法。关于传统问题,据我所知,只有旧的发布插件(
maven
)被认为是旧的,而新插件(
maven publish
)则被认为是旧的。即使有了新的插件,您也可以在
ArtifactHandler
中使用
PublishArtifact
实例,我没有发现任何迹象表明API的这些部分被认为是遗留的或不推荐使用的。编辑得很好!我不知道
Project.files(…)
这正是我一直在寻找的。此外,映射语法可能有助于关闭,因为这有时被认为是第二个参数的一部分,会导致错误。感谢您的回答!但是,这似乎只适用于存档任务,这也在
ArtifactHandler
的文档中有所说明()其他任务也有这样做的方法吗?我不知道这是声明工件的传统方法-我也会研究新方法,也许我的解决方案就在那里。好的,很抱歉我没有注意到文档的这一部分。我编辑了我的答案并添加了更多的想法。关于传统问题,据我所知,只有旧的发布插件(
maven
)被认为是旧的,而新插件(
maven publish
)则被认为是旧的。即使有了新的插件,您也可以在
ArtifactHandler
中使用
PublishArtifact
实例,我没有发现任何迹象表明API的这些部分被认为是遗留的或不推荐使用的。编辑得很好!我不知道
Project.files(…)
这正是我一直在寻找的。此外,map语法可能有助于闭包,因为有时它被认为是第二个参数的一部分,导致错误。