使用 Gradle-Artifactory 插件发布子项目
Posted
技术标签:
【中文标题】使用 Gradle-Artifactory 插件发布子项目【英文标题】:Publishing subprojects with the Gradle-Artifactory plugin 【发布时间】:2014-12-28 15:24:35 【问题描述】:我有以下多项目 Gradle 构建:
myapp/
myapp-client/
build.gradle
src/** (omitted for brevity)
myapp-shared/
build.gradle
src/** (omitted for brevity)
myapp-server
build.gradle
src/** (omitted for brevity)
build.gradle
settings.gradle
myapp/build.gradle
的样子:
subprojects
apply plugin: 'groovy'
sourceCompatibility = '1.7'
targetCompatibility = '1.7'
[compileJava, compileTestJava]*.options*.encoding = 'UTF-8'
repositories
mavenCentral()
maven
// My local/private Artifactory
url "http://localhost:8081/artifactory/myapp-snapshots"
dependencies
compile (
'org.codehaus.groovy:groovy-all:2.3.7'
)
而 3 个子项目 Gradle 文件中的每一个目前都非常简单:
dependencies
compile (
'org.apache.commons:commons-lang3:3.3.2'
)
这是我想要实现的目标:
当我从父目录myapp
运行gradle clean build -Pversion=0.1.5
时,我希望所有三个子项目都使用0.1.5 版本构建;因此myapp-client-0.1.5.jar
、myapp-shared-0.1.5.jar
和myapp-server-0.1.5.jar
。目前我的构建已经这样做了,但是......
如果客户端和共享 JAR 构建成功,我还希望将它们发布到我的私人 Artifactory 存储库。 (我不想发布服务器 JAR)。
我能够找到并测试/确认将 Gradle 构建的 JAR 发布到 Artifactory 的最紧凑的代码是:
buildscript
repositories
maven
url 'http://localhost:8081/artifactory/plugins-release'
credentials
username = "admin"
password = "12345"
name = "maven-main-cache"
dependencies
classpath "org.jfrog.buildinfo:build-info-extractor-gradle:3.0.1"
apply plugin: 'maven-publish'
apply plugin: "com.jfrog.artifactory"
repositories
add buildscript.repositories.getByName("maven-main-cache")
maven
url "http://localhost:8081/artifactory/myapp-snapshots"
artifactory
contextUrl = "http://localhost:8081/artifactory"
publish
repository
repoKey = 'myapp-snapshots'
username = "admin"
password = "12345"
maven = true
defaults
publications ('mavenJava')
publishing
publications
mavenJava(MavenPublication)
from components.java
当我在测试 build.gradle
项目中使用这个 sn-p 并运行 gradle artifactoryPublish
时,它会正确地将我的 JAR 发布到 Artifactory。
我的问题:如何将这个 sn-p 添加到我的项目中,以便从父目录运行 gradle clean build
成功时生成客户端和共享 JAR 并发布到 Artifactory?
虽然不理想,但如果无法一口气完成所有这些,我会愿意将发布作为单独的第二步。有什么想法吗?
【问题讨论】:
【参考方案1】:使用artifactory
插件是正确的做法。
您需要将其应用到allprojects
并使用artifactoryPublish.skip=true
禁用***项目上的部署。
您可以找到一个与您的here 非常相似的项目的完整示例。
默认build
不依赖artifactoryPublish
,所以你需要运行gradle build artifactoryPublish
来上传jar。原因是您可能想要运行大量构建,直到您决定上传某些内容。您可以通过将build
配置为依赖于artifactoryPublish
来建立依赖关系:
build(dependsOn: 'artifactoryPublish')
【讨论】:
@Adil 我认为 JBaruch 引用了github.com/JFrogDev/project-examples/tree/master/…。这是 4.x 版本github.com/JFrogDev/project-examples/blob/master/… 任何线索为什么当单个项目中的相同代码工作时,多项目会跳过 jar 发布?无法弄清楚为什么它会跳过 我遇到的是 FIRST Artifactory 插件是在 root 上配置的,只有 THEN 是 gradle 配置的子项目,因此它们的属性像group
和 version
对 Artifactory 配置不可见.解决此问题的正确方法是什么? [JFrog 示例][1] 使用来自gradle.properties
的版本,以及从根项目设置的组名,我不想这样做。 [1]:github.com/JFrogDev/project-examples/tree/master/…
属性是要走的路。以上是关于使用 Gradle-Artifactory 插件发布子项目的主要内容,如果未能解决你的问题,请参考以下文章
Maven学习总结(54)——使用 git-commit-id-plugin 插件来管理项目发版