• gradle构建脚本


    gradle构建脚本

    gradle构建脚本文件用来处理两件事情,一个是项目另一个就是任务。

    每个gradle生成表示一个或多个项目,一个项目表示一个JAR库或web应用程序,也可能表示由其他项目产生的JAR文件组装的zip。

    简单的说:一个项目是由不同的任务组成。一个任务是指构建的一块工作,任务可能是编译一些类,创建一个JAR,产生Javadoc或发布一些归档文件。

    编写构建脚本

    gradle提供了一个域特定语言DSL,用于描述构建,它使用·Groovy语言,使其更容易形容和构建。gradle中的么一个构建脚本使用UFT8进行编码,并命名为build.gradle。

    创建build.gradle

    我先在E盘创建一个安放gradle脚本的文件夹。E:projectgradle。

    脚本中定义一个任务名称hello,脚本名为build.gradle,内容如下。

    task hello{
        doLast{
            println 'hello world'
        }
    }
    

    然后在该目录下执行gradle -q 任务名

    gradle -q hello
    

    image-20201114222359208

    并且在该目录下生成了.gradle文件夹:

    循环:相当于从0打印到3

    image-20201114222729274

    输出:

    image-20201114222805105

    继续修改脚本:我去掉了hello任务中的doLast块,并且在hello任务前添加了一个新的world任务。

    image-20201114223100899

    执行:gradle -q world

    image-20201114223223789

    build的三个阶段

    • initialization:gradle支持单个或多个工程的构建,在构建阶段,gradle决定哪些工程参与到当前构建过程,并为每一个这一样的工程创建一个project实例,一般情况下,参与构建的工程信息将在setting.gradle中定义。
    • configuration:在这一阶段,配置project的实例,所有工程的构建脚本都将被执行。Task,configuration和其他的对象都将被创建和配置。
    • execution:在之前的配置阶段,task的一个子集被创建并配置,这些子集来自于作为参数传入gradle命令的task名字,在execution阶段,这一子集将依次被执行。

    doLast在execution阶段执行,没写doLast的在configuration这一阶段完成。

    例如,下面的脚本:

    image-20201114224225560

    image-20201114224212640

    image-20201114224344391

    jdk语法支持

    我们甚至可以在gradle中使用jdk的api以及一些语法.

    task hello{
        
    	List<String> strs = Arrays.asList("aa","bb");
    	for(String str : strs){
    	  System.out.println(str);
    	}
    	Map<Integer,String> map = new HashMap<>();
    	map.put(1,"a");
    	map.put(3,"b");
    	for(Integer key:map.keySet()){
    		System.out.println("key:"+key);
    		println 'value:'+map.get(key)
    	}
        println 'hello world'
        
    }
    

    执行:gradle -q hello

    image-20201114225212977

    在一个文件中可以同时存在java语法、gradle语法、scala语法。

    我没学过scala,这里不再演示。

    任务

    任务依赖

    第一种

    这里world任务依赖hello,所以我们执行world时,会先执行hello

    task hello{
    	doLast{
    		println 'hello'
    	}
    }
    
    task world(dependsOn:hello){
    	doLast{
    		println 'world'
    	}
    }
    

    image-20201115112719021

    第二种

    此外,任务之间依赖也可以这样写:

    task hello{
    	doLast{
    		println 'hello'
    	}
    }
    
    task world{
    	doLast{
    		println 'world'
    	}
    }
    world.dependsOn hello
    

    第三种

    task hello{
    	doLast{
    		println 'hello'
    	}
    }
    
    hello.dependsOn{
    	tasks.findAll{
    		task-> task.name.startsWith('world')
    	}
    }
    
    task world1{
    	doLast{
    		println 'world1'
    	}
    }
    task world2{
    	doLast{
    		println 'world2'
    	}
    }
    

    image-20201115113557079

    循环依赖

    task hello(dependsOn:world){
    	doLast{
    		println 'hello'
    	}
    }
    
    task world(dependsOn:hello){
    	doLast{
    		println 'world'
    	}
    }
    

    会报错!所以任务之间不能相互依赖。

    image-20201115112850597

    向任务添加描述

    task world2{
    	description 'this is world2'
    	doLast{
    		println 'world2'
    	}
    }
    

    跳过任务

    我们可以抛出StopExecutionException异常,来跳过当前任务,但是不影响下一步任务的执行。

    task hello{
    	doLast{
    		println 'hello'
    	}
    }
    
    /**在执行hello任务之前,先执行这块,但是抛出这个异常,hello任务将不执行**/
    hello.doFirst{
    	throw new StopExecutionException()
    }
    
    task world(dependsOn: hello){
    	doLast{
    		println 'world'
    	}
    }
    

    image-20201115114327638

  • 相关阅读:
    CF666E. Forensic Examination
    bzoj1396 识别子串
    bzoj2839 集合计数
    unknown
    Hibernate中一级缓存和二级缓存
    亲, 我们来再重申一遍"=="和"equals的区别
    BigDecimal类
    序列化详解
    利用简单的参数传递来实现单条查询的easyui-datagrid
    Oracl 动态执行表不可访问,本会话的自动统计被禁止
  • 原文地址:https://www.cnblogs.com/wwjj4811/p/13975128.html
Copyright © 2020-2023  润新知