Gradle 如何在 zip 依赖项中打包文件

How to pack files inside zip dependency in Gradle

我有一个 Gradle 项目,其依赖项是从 Nexus 存储库下载的。 我想要获取 jar 和 zip 文件的依赖项之一。

jar ("name-version.jar") 可通过以下方式轻松获得:

dependency {
    compile 'group:name:version'
}

但是我想要的另一个神器的名称如下: "name-version-config.zip"

如何从存储库中获取此工件? 我需要这个工件来获取其中的一些文件,以便在我的 package/distribution 任务期间使用。

我已经尝试创建一个新配置并像这样配置:

configurations {
    zipConfig
}

dependencies {
    ...
    compile group: <group>, name: <name>, version: <version>
    zipConfig group: <group>, name: <name>, version: <version> + '-config', ext: 'zip'
}

但这失败了,因为 gradle 将尝试使用错误的路径找到正确的文件名:"group/name/version-config/name-version-config.zip" 我需要它来搜索 "group/name/version/name-version-config.zip"

中的文件

您可以编写 gradle 任务将 zip 文件下载到本地目录,然后按名称将下载的文件用作依赖项。

或者您可以使用自定义 ivy 模式并将 URL 视为自定义布局 ivy 存储库以获取 zip 文件。参见 here

在 Maven 中,我们可以使用分类器生成工件。为了让 Gradle 下载一个带有分类器的特定文件,我定义了一个名为 zipConfig 的新配置,并声明了如下依赖关系:

configurations {
  zipConfig
}

dependencies {
  ...
  zipConfig group:'<group>', name:<name>, version:<version>, ext:'zip', classifier:'config'
}


为了提取 zip 工件的文件并将它们复制到我的包中,我定义了一个任务来解压缩文件并将其中的文件复制到 build/resources 文件夹中。

task unzipConfig(type: Copy) {
  def sdkServerPattern = ".*" + sdkServer + ".*config.*"
  def pattern = ~/$sdkServerPattern/
  def configZipTree = zipTree(configurations.zipConfig.filter{it.name.matches(pattern)}.singleFile)

  from configZipTree
  include '**/*filename1'
  include '**/*filename2'
  into(project.buildDir.path + '/resources')
}


在项目的 "pack" 任务中(所有内容都打包到一个 .tar.gz 文件中)参考资源文件夹中的文件打包在一起。

task pack(type: Tar, dependsOn: unzipConfig) {
  dependsOn build

  compression = Compression.GZIP
  extension = 'tar.gz'

  from(configurations.runtime.allArtifacts.files) {
    into('/lib')
  }

  from(configurations.runtime) {
    into('/lib')
  }

  def sdkConfigFolderName = 'build/resources/' + sdkServer + '-' + sdkServerVersion + '/config/'

  from sdkConfigFolderName + 'filename1'
  from sdkConfigFolderName + 'filename2'

  baseName = project.name + '-distribution'
}