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'
}
我有一个 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'
}