Gradle 的文件操作

众所周知,Gradle 作为一个项目构建工具,使用了 Groovy 语言来表述其脚本代码,而 Groovy 语言中的很多特性设计的有点“反人类”,这些特性对于老手来说写起来非常舒服,但是对于新手就很不友好了,因为不便于理解,很多萌新看着 Gradle 的脚本感觉很简单很清晰的样子,但是真到了自己去写的时候就会感觉无从下手,怎么写怎么报错;本文就从Gradle 的几个简单的文件操作顺带来分析一下这些奇葩的坑点,让大家对 Groovy 语法特性有个大致认知。

准备一个文件目录如下:点击下载

image.png

准确的Tree结构:

root
│  build.gradle
│  solution.gradle
│  
└──src
    ├──docs
    │      aa.aa
    │      install.md
    │      install.txt
    │      readme.txt
    │      
    └──web
        │  index.html
        │  
        └──images
                cat.jpg
                dog.jpg

任务

  1. 拷贝src/web目录到build/web目录,并且拷贝src/docs目录下的所有 txt 文件到build/web/help下。
  2. 打包build/web目录下除 images 文件夹外的所有文件为web.zip,并将web.zip放置于build目录下。
  3. 解压build/web.zipbuild/exploded
  4. 删除build/web/help

解决方案

//1.Copy
task copyWeb(type:Copy){
    from 'src/web'
    from ('src/docs'){
        include '*.txt'
        into 'help'
    }
    into 'build/web'
}
//2.Zip
task bundleWeb(type:Zip,dependsOn:copyWeb){
    baseName 'web'
    destinationDir file('build')

    from 'build/web'
    exclude 'images/**'
}
//3.UnZip
task unpackBundle(type:Copy,dependsOn:bundleWeb){
    from zipTree('build/web.zip')
    into 'build/exploded'
}
//4.Delete
task deleteHelp(type:Delete,dependsOn:copyWeb){
    delete 'build/web/help'
}

是的你没有看错,任务中的4个问题就用上面这20几行代码轻松解决;但是,你可能还是不太清楚这些这些配置的规则,它们看上去就像一堆键值对类似于Json,然而实际上它们都是由属性和方法构成的,就像Java一样:

属性

描述

类型

excludes

排除模式集合

Set<String>

includes

包含模式集合

Set<String>

baseName

文件的基本名称

String

destinationDir

文件生成的目录

File

方法

描述

返回

from(sourcePaths)

指定副本的源文件或目录

AbstractCopyTask

include(includes)

指定包含模式

AbstractCopyTask

exclude(excludes)

指定排除模式

AbstractCopyTask

into(destDir)

指定副本的目标目录

AbstractCopyTask

所以上面解决方案的完整写法:

//1.Copy
task copyWeb(type:Copy){
    from('src/web')
    from('src/docs'){
        include('*.txt')
        into('help')
    }
    into('build/web')
}
//2.Zip
task bundleWeb(type:Zip,dependsOn:copyWeb){
    baseName='web'
    destinationDir=file('build')

    from('build/web')
    exclude('images/**')
}
//3.UnZip
task unpackBundle(type:Copy,dependsOn:bundleWeb){
    from(zipTree('build/web.zip'))
    into('build/exploded')
}
//4.Delete
task deleteHelp(type:Delete,dependsOn:copyWeb){
    delete('build/web/help')
}

这样看起来就清晰多了,以上脚本中用到的所有方法及属性都可以在 Gradle DSL Reference 文档中查到,该文档详尽的解释了每个方法及参数的作用,由于 Groovy 语言的特性,一般 Gradle 脚本都会使用简写的方式,也就是省略掉‘()’、‘=’等符号,因为省略掉这些符号不会影响到语法歧义,说到歧义大家可以看到 3.UnZip 中有一行代码 from(zipTree('build/web.zip')) 即使简写也只能写成 from zipTree('build/web.zip') 而非 from zipTree 'build/web.zip',因为最后这种写法显然使 Groovy 无法理解你要将 'build/web.zip' 作为 zipTree 的参数还是 from 的参数

其实在任何一种计算机语言中各种‘()’、‘[]’、‘{}’都是为了避免产生语法歧义,只要你掌握其中规则,知道怎么写才能避免歧义使代码正常运作,再了解其特有的语言特性如闭包lambda委托等,你就大致掌握了这门语言。现在再来看看 Groovy ,它其实就是一种不需要 public修饰符、类型说明、构造函数以及 ()的 Java简化版。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Ryan Miao

Dagger2 入门解析

前言 在为dropwizard选择DI框架的时候考虑了很久。Guice比较成熟,Dagger2主要用于Android。虽然都是google维护的,但Dagger...

616120
来自专栏Android群英传

掌控 Android Gradle

12720
来自专栏我就是马云飞

设计模式二十四章经之责任链模式

13630
来自专栏北京马哥教育

快收藏! 30 分钟包你学会 AWK

本文大部分内容翻译自我开始学习AWK时看到的一篇英文文章 AWK Tutorial ,觉得对AWK入门非常有帮助,所以对其进行了粗略的翻译,并对其中部分内容进行...

20430
来自专栏Hongten

java开发_UUID(Universally Unique Identifier,全局唯一标识符)和GUID(Globally Unique Identifier,全球唯一标识符)

GUID: 即Globally Unique Identifier(全球唯一标识符) 也称作 UUID(Universally Unique IDentifie...

12010
来自专栏喵了个咪的博客空间

zephir-(2)安装和初体验

zephir-安装和初体验 ? 前言 先在这里感谢各位zephir开源技术提供者 zephir主要是解决了PHP开发人员尝试编写和编译PHP拓展所能执行的代码的...

41260
来自专栏犀利豆的技术空间

徒手撸框架--实现 RPC 远程调用

微服务已经是每个互联网开发者必须掌握的一项技术。而 RPC 框架,是构成微服务最重要的组成部分之一。趁最近有时间。又看了看 dubbo 的源码。dubbo 为了...

16620
来自专栏北京马哥教育

快收藏! 30 分钟包你学会 AWK

本文大部分内容翻译自我开始学习AWK时看到的一篇英文文章 AWK Tutorial ,觉得对AWK入门非常有帮助,所以对其进行了粗略的翻译,并对其中部分内容进行...

31770
来自专栏battcn

一起来学SpringBoot | 第十八篇:轻松搞定全局异常

实际项目开发中,程序往往会发生各式各样的异常情况,特别是身为服务端开发人员的我们,总是不停的编写接口提供给前端调用,分工协作的情况下,避免不了异常的发生,如果直...

14820
来自专栏Albert陈凯

2018-05-28 Google Guava官方教程(中文版)from ifeve.com

33730

扫码关注云+社区

领取腾讯云代金券