如何在 gradle 子项目中使用 gradle Artifactory 插件

How to use gradle Artifactory plugin in gradle subproject

我有一个多项目 gradle 构建,其中一个子项目正在应用 Artifactory 插件(版本 4.2.0),并配置 contextUrl 和解析 repoKey。

它设置了一个简单的配置和依赖项,然后有一个复制任务来检索依赖项作为 zip 文件并将其解压缩到一个目录中。

然而,当复制任务运行s时,我得到以下错误。我究竟做错了什么?这是 Artifactory 插件的问题,还是 gradle,或...?

问题似乎与这是否是一个子项目无关。如果我从子项目目录中删除多项目配置和 运行 任务,我会得到同样的错误。

FAILURE: Build failed with an exception.

* Where:
Build file 'C:\Users\hoobajoob\project\subproject\package.gradle' line: 36

* What went wrong:
A problem occurred evaluating project ':subproject'.
> Could not resolve all dependencies for configuration ':subproject:runtimeDep'.
   > Cannot resolve external dependency company.com:artifact-id:1.0.0 because no repositories are defined.

以下是 subproject/package.gradle 的内容(Artifactory url/user/password 属性在子项目的 gradle.properties 文件中):

plugins {
  id "com.jfrog.artifactory" version "4.2.0"
}

artifactory {
    contextUrl = "${artifactory_contextUrl}"
    resolve {
        repository {
          username = "${artifactory_user}"
          password = "${artifactory_password}"
          repoKey = 'some-repo'
        }
    }
}

configurations {
    runtimeDep
}

dependencies {
    runtimeDep 'company.com:artifact-id:1.0.0@zip'
}

ext.destination = null
task getDependencies(type: Copy) {
    from zipTree { configurations.runtimeDep.singleFile }
    into ".artifacts/runtime"
}

除了包装器任务外,根项目构建脚本是空的。下面是 settings.gradle 文件:

include 'subproject'
rootProject.children.each { project -> project.buildFileName = "package.gradle" }

作为 Gradle 打印到控制台:

您没有定义 repositories{} 块,因此它不知道如何下载声明的依赖项。

虽然我的问题中的任务设置不同,但这似乎与 this other SO question 中描述的症状相同。

问题似乎与 Artifactory 插件在 gradle 的执行阶段之前不会执行依赖项解析有关。我假设在带有闭包的 getDependencies 任务中定义 zipTree 步骤的参数会产生将依赖项解析推迟到该阶段的效果。

但是,为了让复制任务延迟,我需要将 getDependencies 任务的 from 配置定义为闭包,并将 zipTree 操作包含在关闭。

两者的区别:

from zipTree { configurations.runtimeDep.singleFile } // doesn't work

...和

from { zipTree( configurations.runtimeDep.singleFile ) } // works

进行此更改可以解决问题(不需要 maven repositories 块)。

另一个解决方案是完全放弃 Artifactory 配置(在这种情况下我可以这样做,因为我不需要利用 Artifactory 独有的任何东西)并使用传统的 gradle repositories 块,如另一个 SO 问题和 crazyjavahacking 所述。这样做会使构建脚本更短,我可以保留 zipTree 步骤的配置,因为它最初是这样写的:

repositories {
   maven {
      url "${artifactory_contextUrl}/repo-key"
   }
}

configurations {
    runtimeDep
}

dependencies {
    runtimeDep 'company.com:artifact-id:1.0.0@zip'
}

ext.destination = null
task getDependencies(type: Copy) {
    from zipTree { configurations.runtimeDep.singleFile }
    into ".artifacts/runtime"
}