我有包含非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
(例如Zip
或Jar
),只需传递任务就足够了:
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/