如何从文件列表在 gradle 中创建 zip?

And*_*dyJ 6 gradle

这肯定是一个 gradle 新手问题,但它真的让我感到沮丧。我的源代码树如下所示:

|-- master
    buildSrc
    build.gradle
|-- comp1
    !-- filea
    !-- fileb
|-- comp2
    !-- file1
    !-- file2
    !-- etc
Run Code Online (Sandbox Code Playgroud)

我正在使用自定义任务(在 prepBundle 中调用(未显示))build.gradlemaster目录中运行 ,以生成需要在 zip 文件中的文件列表。列表中有一些各种外部处理,因此没有办法使用任何基本的包含或闭包来生成列表。

这就是我所拥有的:

task showFilelist(dependsOn:prepBundle){ 
  prepBundle.outputs.files.each{ 
    println "including file: ${it}"
  }
}

task createBundle(type:Zip,dependsOn:prepBundle){ 
  inputs.files(prepBundle.outputs.files)
  outputs.file(archiveName)
  baseName = "somebundle"
  from ".."
  include prepBundle.outputs.files
}
Run Code Online (Sandbox Code Playgroud)

如果我只运行 showFilelist,我会得到我想要压缩的文件的正确解析路径:

<snip>
:showFilelist
including file: C:\fullpath\master\build.gradle
including file: C:\fullpath\comp1\filea
including file: C:\fullpath\comp2\file1
Run Code Online (Sandbox Code Playgroud)

但是当我运行我的捆绑任务时,它爆炸了:

:createBundle

FAILURE: Build aborted because of an internal error.

* What went wrong:
Build aborted because of an unexpected internal error. Please file an issue at: http://forums.gradle.org.

* Try:
Run with --debug option to get additional debug info.

* Exception is:
org.gradle.api.UncheckedIOException: java.io.IOException: The process cannot access the file because another process has locked a portion of the file
        at org.gradle.util.hash.HashUtil.createHash(HashUtil.java:56)
        at org.gradle.util.hash.HashUtil.createHash(HashUtil.java:34)
        at org.gradle.api.internal.changedetection.state.DefaultHasher.hash(DefaultHasher.java:24)
        at org.gradle.api.internal.changedetection.state.CachingHasher.hash(CachingHasher.java:45)
        at org.gradle.api.internal.changedetection.state.DefaultFileSnapshotter$1.run(DefaultFileSnapshotter.j
ava:48)
        at org.gradle.internal.Factories$1.create(Factories.java:22)
        at org.gradle.cache.internal.DefaultCacheAccess.useCache(DefaultCacheAccess.java:143)
        at org.gradle.cache.internal.DefaultCacheAccess.useCache(DefaultCacheAccess.java:131)
        at org.gradle.cache.internal.DefaultPersistentDirectoryStore.useCache(DefaultPersistentDirectoryStore.
Run Code Online (Sandbox Code Playgroud)

在 prepBundle 中,我迭代了文件列表,并且没有其他进程正在使用任何文件。我不相信这是一个 gradle 问题,我认为这是我在 zip 任务的配置上做错的事情。如果我改变createBundle一点来删除输入和输出,它看起来像这样:

task createBundle(type:Zip,dependsOn:prepBundle){ 
  baseName = "somebundle"
  include prepBundle.outputs.files
}
Run Code Online (Sandbox Code Playgroud)

但是然后什么都不做:

:createBundle UP-TO-DATE

BUILD SUCCESSFUL
Run Code Online (Sandbox Code Playgroud)

当我只有一个文件列表并且文件的父根目录不在我当前的项目下时,我应该如何将这个 zip 放在一起?

谢谢你的帮助!

  • 安迪

ank*_*.in 8

您可以轻松创建带有任务的 zip 文件,请看下面的示例:

task createDist(type: Zip){
  archiveName="dist.zip"
  destinationDir = file('build/')
  from (files('./test-module/build/libs'))
}
Run Code Online (Sandbox Code Playgroud)

您可以使用多种方法在此处包含文件,例如:

 from fileTree('./libs')
 from project('config').jar.outputs.files
 from project('core').jar.outputs.files
 from project('batch-jobs').jar.outputs.files
 from project('gateway1').jar.outputs.files
 from project('gateway2').jar.outputs.files
Run Code Online (Sandbox Code Playgroud)

  • Gradle 中记录的“魔法”功能在哪里?前任。第一个 files() 调用,或 fileTree() 或 project().jar.outputs.files。对我来说,关于 Gradle 的令人沮丧的事情是人们总是说“就这样做:”并且从来没有提供任何关于我们如何能够*自己解决这个问题的信息*......而 Gradle 手册大约有 500 页... (4认同)

小智 5

我不确定背后的具体问题是什么,但我认为这与

inputs.files(prepBundle.outputs.files)
Run Code Online (Sandbox Code Playgroud)

和/或(这是多余的,可能会破坏事物)

outputs.file(archiveName)
Run Code Online (Sandbox Code Playgroud)

我想,您想将所有文件添加prepBundle到您的存档中。当您使用任务from的继承Copy任务的属性时,可以轻松实现这一点Zip

使用该from属性会将您的任务更改为

task createBundle(type:Zip,dependsOn:prepBundle){ 
  prepBundle.outputs.files.each {
    from it.getPath() // adds every single file to the archive
  }
  baseName = "somebundle"
  from ".." // I assume that you add another path here not ".." 
}
Run Code Online (Sandbox Code Playgroud)

如您所见,我也跳过了该include部分,output.file(..)因为include在使用from特定文件时属性是多余的。output.file(..)是多余的,因为它已经由Zip任务定义。