使用Gradle 2.11
和JVM 1.8.0_77
。
ziptree的Gradle复制任务似乎不喜欢zip-trees中的点文件夹,因为它完全忽略了.git
文件夹:
Archive.zip:
archive/someFile
archive/.manifest
archive/.git/objects/93/
archive/.git/objects/93/c426c3ffd836bfc0af36e6fd97a72b7b4f67be
archive/.git/objects/info/
archive/.git/objects/aa/
Gradle任务
task unzip(type: Copy) {
def zipFile = file("archive.zip")
from zipTree(zipFile)
into workingDir
}
结果:
> $ gradle unzip
> $ find archive/.
archive/someFile
archive/.manifest
使用像include '**/.git'
这样的东西似乎也不起作用。
有什么想法吗?
答案 0 :(得分:4)
Gradle复制任务使用ant的DirectoryScanner,它附带了一系列默认排除项,包括**/.git
和**/.git/**
。有关默认排除的完整列表,请参阅本文的底部。请参阅当前打开且未解决的缺陷GRADLE-1883。
您可以通过从中删除git条目来自定义默认排除列表,但任务中的任何更改都会影响后续复制任务,这可能会导致任务下坡的潜在问题。
该缺陷页面上建议的(相当难看的)安全解决方法是删除任务中的默认排除项,并在退出任务之前重置排除项。
import org.apache.tools.ant.DirectoryScanner
task unzip(type: Copy) {
doFirst {
DirectoryScanner.defaultExcludes.each { DirectoryScanner.removeDefaultExclude it }
DirectoryScanner.addDefaultExclude 'something has to be in here or everything gets excluded'
}
doLast {
DirectoryScanner.resetDefaultExcludes()
}
def zipFile = file("archive.zip")
from zipTree(zipFile)
into workingDir
}
Ant默认排除模式:
**/%*%
**/.git/**
**/SCCS
**/.bzr
**/.hg/**
**/.bzrignore
**/.git
**/SCCS/**
**/.hg
**/.#*
**/vssver.scc
**/.bzr/**
**/._*
**/#*#
**/*~
**/CVS
**/.hgtags
**/.svn/**
**/.hgignore
**/.svn
**/.gitignore
**/.gitmodules
**/.hgsubstate
**/.gitattributes
**/CVS/**
**/.hgsub
**/.DS_Store
**/.cvsignore
答案 1 :(得分:0)
前段时间,我有同样的问题,但没有解压缩,而是拉链。到那个时候我找不到这个解决方案,并且不知道如何在gradle中修复“默认排除”的事情。我从ant找到了相同的解决方案,并使用ant任务创建了一个包含“default excluded .git”目录的ZIP。我正在为那些可能觉得有用的人粘贴我的解决方法。
task createZip << {
description 'Creates a zip file under build folder'
ant.zip(destfile: filename) {
fileset(dir: projectDir, defaultexcludes: 'no') {
exclude(name: '*.zip, build/**, gradle/**, gradlew*, .idea/**')
}
}
我刚刚复制了代码片段,filename是一个在构建文件的另一部分中赋值的变量。我有一个排除列表,如果需要,您可以拥有自己的列表。唯一要提到的是:如何在gradle任务中调用ant任务,然后将“defaultExcludes”参数设置为NO以达到目的。