使用maven publish gradle插件获取已发布工件的uri
发布之后,我想知道发布工件的url是什么(以便在其他gradle任务中使用它进行自动部署)使用maven publish gradle插件获取已发布工件的uri,gradle,nexus,maven-publish,Gradle,Nexus,Maven Publish,发布之后,我想知道发布工件的url是什么(以便在其他gradle任务中使用它进行自动部署) 有没有办法捕获生成的url?遗憾的是,通过gradle构建系统无法获取此信息。。。您可以做的是创建一个任务来完成发布任务。然后让该任务查询maven存储库中的最新版本。Maven将查看Maven metadata.xml文件,并返回标记值或最新上载(如果缺少)。您可以从响应的位置标题获得确切的下载url 下面是一个如何查询maven回购的示例 $ curl -Is 'http://my.nexus.rep
有没有办法捕获生成的url?遗憾的是,通过gradle构建系统无法获取此信息。。。您可以做的是创建一个任务来完成
发布
任务
。然后让该任务
查询maven存储库中的最新版本。Maven将查看Maven metadata.xml
文件,并返回
标记值或最新上载(如果缺少)。您可以从响应的位置
标题获得确切的下载url
下面是一个如何查询maven回购的示例
$ curl -Is 'http://my.nexus.repo.com:8081/nexus/service/local/artifact/maven/redirect?r=Release&g=com.my.group.id&a=myArtifactId&v=RELEASE&p=war' | grep -Fi Location | cut -d' ' -f2
http://my.nexus.repo.com:8081/nexus/service/local/repositories/Release/content/com/my/group/id/myArtifactId/1.0.012/myArtifactId-1.0.012.war
解释命令
curl -Is http://<nexus-url>:<nexus-port>/nexus/service/local/artifact/maven/redirect?r=<nexus-repository>&g=<artifact-group-id>&a=<artifact-name>&v=<artifact-version>
curl
-I # only print return headers
-s # quiet output of curl's downloading progress
url params
r # nexus-repository name, tends to be Release or Snapshot
g # group id for the artifact
a # artifact id
v # artifact version or a link like RELEASE (don't use LATEST it's problematic)
## you can also supply classifier and extension if needed
c # artifact classifier
e # artifact extension
curl-Is http://:/nexus/service/local/artifact/maven/redirect?r=&g=&a=&v=
卷曲
-I#仅打印返回标题
-curl下载进度的s#quiet输出
url参数
r#nexus存储库名称,通常是发行版或快照
工件的g#组id
a#工件id
v#工件版本或类似链接的版本(不要使用最新版本,这是有问题的)
##如果需要,还可以提供分类器和扩展
c#伪影分类器
伪影扩展
我找到了一个名为maven metadata remote.xml
的文件的本地副本,该文件已上载。它位于以下目录下:build/tmp/publishmavenpublicationtonexusresposition/
例如:
$ cat build/tmp/publishMavenPublicationToNexusRepository/com/example/my.package/0.1.0-SNAPSHOT/maven-metadata-remote.xml
<?xml version="1.0" encoding="UTF-8"?>
<metadata>
<groupId>com.example</groupId>
<artifactId>my.package</artifactId>
<version>0.1.0-SNAPSHOT</version>
<versioning>
<snapshot>
<timestamp>20180326.191238</timestamp>
<buildNumber>36</buildNumber>
</snapshot>
<lastUpdated>20180326191238</lastUpdated>
</versioning>
</metadata>
您可以扩展所有maven发布任务并再次计算url: 我只需要文件夹-对于发布工件,您也可以在最后添加工件,但我还没有找到一个好的快照解决方案。nexus基本回购URL预计是已知的
tasks.withType(AbstractPublishToMaven) {
doLast {
String urlString = nexusUrl.toString() + convertPackageNameToPath(publication.groupId) + "/" + publication.artifactId + "/" + publication.version
println "Artifact URL: " + urlString
}
}
static String convertPackageNameToPath(String packageName) {
return packageName.replace(".", "/");
}
@Hollerweger的答案可能是最不粗俗的,但在以下几个方面是错误的:
publishToAvenLocal
和publishToAvenRepository
的超类。扩展它并打印一条消息说工件已发布到Nexus是错误的,因为即使发布到本地Maven repo,该消息也将被打印。要使用的正确任务类是发布到远程repo的PublishToMavenRepository
存储库
属性tasks.withType(PublishToMavenRepository) {
doFirst {
println("Publishing ${publication.groupId}:${publication.artifactId}:${publication.version} to ${repository.url}")
}
}
在我的例子中,它似乎不是快照的完整url,因为url还包括“yyyyMMdd.HHmmSS”模式和发布索引。你有什么诀窍吗?@Kikiwa为你的特例打开了一个新问题。谢谢你的建议,本地maven-medata-remote.xml的诀窍对我来说很不错。这种方法更简洁,但没有考虑快照策略的Maven/Nexus版本控制机制。(此策略在URL中的文件扩展名之前添加了日期和内部版本号,据我所知,不幸的是没有快捷方式。)@Kikiwa URI是发布到Maven存储库的,而不是发布到工件,因此它与快照无关。我们在公司中使用此解决方案,并按预期工作。如果您找到了一个适合您的解决方案,这很酷,但是,正如我之前所说的,请使用示例应用程序打开一个新问题。
tasks.withType(PublishToMavenRepository) {
doFirst {
println("Publishing ${publication.groupId}:${publication.artifactId}:${publication.version} to ${repository.url}")
}
}