zoukankan      html  css  js  c++  java
  • Gradle:构建脚本概要

    一、构建块 

    1.每一个构建块都包括三个基本构建块:project、task和property; 

    2.每一个构建块包括至少一个project,进而又包括一个或多个task; 

    3.project和task暴露的属性能够用来控制构建快; 

     

    二、项目 

    1.一个项目(project)代表一个正在构建的组件(比方,一个JAR文件)。或一个想要完毕的目标。如部署应用程序; 

    2.每一个Gradle构建脚本至少定义一个项目,当构建启动后。Gradle基于build.gradle中的配置实例化org.gradle.api.Project类。并且能够通过project变量使其隐式可用。 

    3.一个project能够创建新的task,加入依赖和配置,并应用插件和其他构建脚本; 

    //不显式使用project变量的情况设置项目描写叙述 
    setDescription("myProject"); 
    //在不使用project变量的情况通过Groovy语法类訪问name和description属性 
    println "Description of project $name:" + project.description 

     

    三、任务 

    1.Task的一些重要功能:任务动作(task action)和任务依赖(task dependency); 

    2.任务定义了一个当任务运行时最小的工作单元,能够简单到仅仅打印“Hello world!”,或复杂到编译Java源码。 

     

    四、属性 

    1.每一个Project和Task实例都提供了能够通过getter和setter方法訪问的属性; 

    2.一个属性可能是一个任务的描写叙述或项目的版本号; 

    3.扩展属性:Gradle的非常多领域模型提供了特别的属性类型,在内部以键值对的形式存储; 

    //仅仅在初始生命扩展属性时须要ext命令空间 
    project.ext.myPro = 'myValue' 
    ext { 
        someOtherProp = 123 
    } 
     
    //使用ext命令控件訪问属性是可选的 
    assert myProp == 'myValue' 
    println project.someOtherProp 
    ext.someOtherProp = 567 

    4.Gradle属性: 

    • Grale属性能够通过在gradle.properties文件里声明直接加入到项目中。这个文件位于<USER_HOME>/.gradle文件夹或项目文件夹下。这些属性能够通过项目实例訪问。 

    • 即使你有多个项目。每一个用户也仅仅能有一个Gradle属性文件在<USER_HOME>/.gradle文件夹下。 

    gradle.properties文件: 

    examplePro = myValue 
    someOtherProp = 455 

    能够通过例如以下方式訪问项目两个变量: 

    assert project.exampleProp == 'myValue' 
    task printGradleProperty << { 
        println "Second property:$someOtherProp" 
    } 

    5.声明属性的其他方式:Gradle也提供了非常多其他方式为构建提供属性。比方: 

    • 项目属性通过-P命令行选项提供; 

    • 项目属性通过-D命令行选项提供。 

    • 环境变量依照以下的模式提供:ORG_GRADLE_PROJECT_propertyName=someValue 

     

    五、使用Task 

    1.声明task动作: 

    • 动作(action)就是在task中合适的地方放置构建逻辑; 

    • Task接口提供了两个不相关的方法来声明task动作:doFirst(Closure)和doLast(Closure)。 

    • 当task被运行的时候,动作逻辑被定义为闭包參数一次运行; 

    version = '1.0-SNAPSHOT' 
     
    //声明一个包括doFirst和doLast的task 
    task printVersioin { 
        doFirst { 
            println "Before reading the project version"  
        }  
     
        doLast { 
            println "Version: $version"  
        } 
    } 
     
    //在动作列表的開始加入doFirst闭包 
    printVersion.doFirst { println "First action" } 
    //使用doLast别名在动作列表的最后加入闭包 
    printVersion << { println "Last action" } 

    六、訪问Default属性 

    task printVersion << { 
        logger.quiet "Version: $version" 
    } 
     
    //在创建task时候。为这两个属性设置值作为參数 
    task printVersion(group: 'versioning', description: 'Prints project version.') << { 
        logger.quiet "Versioin: $version" 
    } 
     
    task printVersion { 
        //通过getter和setter方法来设置属性 
        group = 'versioning' 
        description = 'prints project version.' 
     
        doLast { 
            logger.quiet "Version: $version" 
        } 
    } 

     七、定义Task依赖 

    1.dependsOn方法同意声明一个或多个task。以下清单显示了使用dependsOn方法应用task依赖的不同方式: 

    build.gradle文件: 

    task first << { println "first" } 
    task sencond << { println "second"} 
     
    //指定多个task依赖 
    task printVersion { dependsOn: [second, first] } << { 
        logger.quiet "Version:$version" 
    } 
    task  third << { println "third" } 
    third.dependsOn{ 'printVersion ' } 
    

    运行构建: 

    C:Userschengxiang.peng.QUNARSERVERSGradleSourcesgradle-in-action-sourcechap 
    ter04listing_04_01-task-dependencies>gradle -q third 
    first 
    second 
    Version: 0.1-SNAPSHOT 
    third 

    2.Gradle的思想是声明在一个给定的task之前什么该运行,而未定义他该怎样运行; 

    3.在Gradle中,运行顺序是由task的输入/输出规范自己主动确定的: 

    • 一方面,不须要知道整个task依赖链上的关系是否发生改变; 

    • 还有一方面。由于构建没有严格的运行顺序。也就是支持task的并行运行,这样能够极大的节约构建运行时间; 

     

    八、终结器task 

    在实践中。你会发现所依赖的task运行后须要清理某种资源。典型的样例就是Web容器须要对已经部署的应用程序进行集成測试。 

    1.终结器task:即使终结task失败了,Gradle的task也会按预期运行; 

    build.gradle文件: 

    task first << { println "first" } 
    task second << { println "second" } 
    //声明一个task被还有一个task终结 
    first.finalizedBy second 
    运行脚本: 

    C:Userschengxiang.peng.QUNARSERVERSGradleSourcesgradle-in-action-sourcechap 
    ter04finalizer-task>gradle -q first 
    first 
    second 

    九、加入随意代码 

    1.通过POGO来表示项目的版本号: 

    build.gradle文件: 

    //依据java.lang.Object表示的version属性;Gradle总是调用toString()来获取version的值 
    version = new ProjectVersion(0, 1) 
     
    class ProjectVersion { 
        Integer major 
        Integer minor 
        Boolean release 
     
        ProjectVersion(Integer major, Integer minor) { 
            this.major = major 
            this.minor = minor 
            this.release = Boolean.FALSE 
        } 
     
        ProjectVersion(Integer major, Integer minor, Boolean release) { 
            this(major, minor) 
            this.release = release 
        } 
     
        @Override 
        String toString() { 
            //仅仅有当release属性值为false的时候,版本号上才会加入-SNAPSHOT后缀 
            "$major.$minor${release ?

    '' : '-SNAPSHOT'}" } } task printVersion << { logger.quiet "Version: $version" }  

    运行构建: 

    C:Userschengxiang.peng.QUNARSERVERSGradleSourcesgradle-in-action-sourcechap 
    ter04listing_04_02-project-version-pogo>gradle printVersion 
    :printVersion 
    Version: 0.1-SNAPSHOT 
     
    BUILD SUCCESSFUL 

    十、理解task配置 

    1.Task定义没有使用左移操作符(<<),Gradle称之为task配置; 

    2.task配置块永远在task动作运行之前被运行。 

    version.properties文件: 

    major=0 
    minor=2 
    release=false 
    build.gradle文件: 

    //Project接口提供了file方法;它会创建一个相对于项目文件夹的java.io.File实例 
    ext.versionFile = file('version.properties') 
     
    //没有使用左移操作符定义task配置 
    task loadVersion { 
        project.version = readVersion() 
    } 
     
    ProjectVersion readVersion() { 
        logger.quiet 'Reading the version file.' 
         
        //假设版本号文件不存在,将抛出GradleException异常,带有对应的错误消息 
        if (!versionFile.exists()) { 
            throw new GradleException("Required version file does not exist: $versionFile.canonicalPath") 
        } 
     
        Properties versionProps = new Properties() 
         
        //Groovy的文件实现通过加入新的方法来读取InputStream 
        versionFile.withInputStream { stream -> 
            versionProps.load(stream) 
        } 
     
        //在Groovy中,假设return是方法中最后一条语句的话,则能够省略它 
        new ProjectVersion(versionProps.major.toInteger(), versionProps.minor.toInteger(), versionProps.release.toBoolean()) 
    } 
     
    task printVersion << { 
        logger.quiet "Version: $version" 
    } 
     
    class ProjectVersion { 
        Integer major 
        … …  
     } 
    运行构建: 

    C:Userschengxiang.peng.QUNARSERVERSGradleSourcesgradle-in-action-sourcechap 
    ter04listing_04_03-configuration-task>gradle printVersion 
    Reading the version file. 
    :printVersion 
    Version: 0.2-SNAPSHOT 
     
    BUILD SUCCESSFUL 
     
    Total time: 3.552 secs 
    3.不管什么时候运行Gradle构建。都会运行三个不同的生命周期阶段: 

    • 初始化阶段:Gradle为项目创建了一个Project实。 

    • 配置阶段:适合于项目或指定task设置所需的配置,项目每一次构建的不论什么配置代码都能够被运行-即使你仅仅运行gradle tasks。 

    • 运行阶段:全部task都应该以正确的顺序运行,运行顺序由它们依赖决定的。假设任务被觉得没有改动过。将被跳过; 

     

    十一、声明task的inputs和outputs 

    1.Gradle通过比較两个构建task的inputs和outputs来决定task是否是最新的,仅仅有当inputs和outputs不同一时候,task才运行。否则将跳过。 

    version.properties文件: 

    major=0 
    minor=1 
    release=true 
    build.gradle文件: 

    ext.versionFile = file('version.properties') 
     
    task loadVersion { 
        project.version = readVersion() 
    } 
     
    ProjectVersion readVersion() { 
        … …  
    } 
     
    task makeReleaseVersion(group: 'versioning', description: 'Makes project a release version.') { 
        //在配置阶段声明inputs/outputs 
        //声明版本号的release属性作为输入 
        inputs.property('release', version.release) 
        //由于版本号文件被改动了,所以它被声明作为输出文件属性  
        outputs.file versionFile 
     
        doLast { 
            version.release = true 
            //Ant task的propertyfile提供了一个遍历的方式来改动属性文件 
            ant.propertyfile(file: versionFile) { 
                entry(key: 'release', type: 'string', operation: '=', value: 'true') 
            } 
        } 
    } 
     
    class ProjectVersion { 
        … …  
    } 

    运行构建: 

    C:Userschengxiang.peng.QUNARSERVERSGradleSourcesgradle-in-action-sourcechap 
    ter04listing_04_05-task-inputs-outputs>gradle makeReleaseVersion 
    Reading the version file. 
    :makeReleaseVersion 
     
    BUILD SUCCESSFUL 
     
    Total time: 4.775 secs 
    //Gradle已经知道项目版本号被设置为公布版本号,并且自己主动跳过task的第二次运行 
    C:Userschengxiang.peng.QUNARSERVERSGradleSourcesgradle-in-action-sourcechap 
    ter04listing_04_05-task-inputs-outputs>gradle makeReleaseVersion 
    Reading the version file. 
    :makeReleaseVersion UP-TO-DATE 
     
    BUILD SUCCESSFUL 
     
    Total time: 3.457 secs 

    十二、编写和使用自己定义的Task 

    1.自己定义Task包括两个组件。自己定义的task类,封装了逻辑行为。也被称作任务类型。 

    2.真实的task,提供了用于配置行为的task类所暴露的属性值; 

    3.可维护性是编写自己定义task类的优势之中的一个,增强的task的长处是可重用性; 

    version.propertioes文件: 

    #Mon, 08 Apr 2013 06:40:21 -0400 
    major=0 
    minor=1 
    release=true 
    build.gradle文件: 

    ext.versionFile = file('version.properties') 
     
    task loadVersion { 
        project.version = readVersion() 
    } 
     
    ProjectVersion readVersion() { 
        … …  
    } 
     
    //创建一个ReleaseVersionTask类型的task。并通过它的属性赋值来设置输入和输出 
    task makeReleaseVersion(type: ReleaseVersionTask) { 
        release = version.release 
        destFile = versionFile 
    } 
     
    //编写一个继承Gradle默认task实现的自己定义task 
    class ReleaseVersionTask extends DefaultTask { 
        //通过注解声明task的输入/输出 
        @Input Boolean release 
        @OutputFile File destFile 
         
        //在构造器中设置task的group和description属性 
        ReleaseVersionTask() { 
            group = 'versioning' 
            description = 'Makes project a release version.' 
        } 
         
        //使用注解声明将被运行的方法 
        @TaskAction 
        void start() { 
            project.version.release = true 
            ant.propertyfile(file: destFile) { 
                entry(key: 'release', type: 'string', operation: '=', value: 'true') 
            } 
        } 
    } 
     
    class ProjectVersion { 
        … …  
    } 
    运行构建: 

    C:Userschengxiang.peng.QUNARSERVERSGradleSourcesgradle-in-action-sourcechap 
    ter04listing_04_07-custom-task-usage>gradle makeReleaseVersion 
    Reading the version file. 
    :makeReleaseVersion 
     
    BUILD SUCCESSFUL 
     
    Total time: 4.887 secs 
     
    C:Userschengxiang.peng.QUNARSERVERSGradleSourcesgradle-in-action-sourcechap 
    ter04listing_04_07-custom-task-usage>gradle makeReleaseVersion 
    Reading the version file. 
    :makeReleaseVersion UP-TO-DATE 
     
    BUILD SUCCESSFUL 
     
    Total time: 3.45 secs 

    十三、应用自己定义task的可重用性 

    project-version.properties文件: 

    #Mon, 04 Jan 2016 00:51:46 +0800 
    major=0 
    minor=1 
    release=true 
    build.gradle文件: 

    ext.versionFile = file('project-version.properties') 
     
    task loadVersion { 
        project.version = readVersion() 
    } 
     
    ProjectVersion readVersion() { 
        … …  
    } 
     
    //为makeReleaseVersion task设置单独的属性值 
    task makeReleaseVersion(type: ReleaseVersionTask) { 
        //POGO版本号表示使用prodReady属性来指示公布标识 
        release = version.prodReady 
        //指定不同的版本号文件对象 
        destFile = new File('project-version.properties') 
    } 
     
    class ReleaseVersionTask extends DefaultTask { 
        @Input Boolean release 
        … …  
    } 
     
    //在还有一个项目中不同的POGO暴露不同的属性 
    class ProjectVersion { 
        Integer min 
        Integer maj 
        Boolean prodReady 
     
        @Override 
        String toString() { 
            "$maj.$min${prodReady ? '' : '-SNAPSHOT'}" 
        } 
    } 
    运行构建: 

    C:Userschengxiang.peng.QUNARSERVERSGradleSourcesgradle-in-action-sourcechap 
    ter04listing_04_09-custom-task-reusability>gradle makeReleaseVersion 
    Reading the version file. 
    :makeReleaseVersion 
     
    BUILD SUCCESSFUL 
     
    Total time: 4.875 secs 
    C:Userschengxiang.peng.QUNARSERVERSGradleSourcesgradle-in-action-sourcechap 
    ter04listing_04_09-custom-task-reusability>gradle makeReleaseVersion 
    Reading the version file. 
    :makeReleaseVersion UP-TO-DATE 
     
    BUILD SUCCESSFUL 
     
    Total time: 3.448 secs 

    十四、Gradle的内置task类型 

    1.一个好的回滚策略是必须的,保留一份最新的稳定的应用程序可交付版本号的备份非常重要! 

    2.你想要运行的task顺序: 

    make ReleaseVersion->war->create Distribution->backup ReleaseVersion->release 

    3.task依赖判断:通过使用一个task的输出作为还有一个task的输入,Gradle就能够判断出依赖关系了。 

     build.gradle文件: 

    apply plugin: 'war' 
    ext.versionFile = file('version.properties') 
     
    task loadVersion { 
        project.version = readVersion() 
    } 
     
    ProjectVersion readVersion() { 
       … …  
    } 
     
    task makeReleaseVersion(group: 'versioning', description: 'Makes project a release version.') << { 
        version.release = true 
        ant.propertyfile(file: versionFile) { 
            entry(key: 'release', type: 'string', operation: '=', value: 'true') 
        } 
    } 
     
    task createDistribution(type: Zip, dependsOn: makeReleaseVersion) { 
        //隐式引用War task的输出     
        from war.outputs.files 
     
        //把全部源文件都放到ZIP文件的src文件夹下  
        from(sourceSets*.allSource) { 
            into 'src' 
        } 
     
        //为ZIP文件加入版本号文件 
        from(rootDir) { 
            include versionFile.name 
        } 
    } 
     
    task backupReleaseDistribution(type: Copy) { 
        //隐式引用createDistribution的输出 
        from createDistribution.outputs.files 
        into "$buildDir/backup" 
    } 
     
    task release(dependsOn: backupReleaseDistribution) << { 
        logger.quiet 'Releasing the project...' 
    } 
     
    class ProjectVersion { 
        … …  
    } 
    运行构建: 

    C:Userschengxiang.peng.QUNARSERVERSGradleSourcesgradle-in-action-sourcechap 
    ter04listing_04_10-built-in-tasks>gradle release 
    Reading the version file. 
    :makeReleaseVersion 
    :compileJava UP-TO-DATE 
    :processResources UP-TO-DATE 
    :classes UP-TO-DATE 
    :war 
    :createDistribution 
    :backupReleaseDistribution 
    :release 
    Releasing the project... 
     
    BUILD SUCCESSFUL 
     
    Total time: 4.853 secs 

  • 相关阅读:
    nyoj----522 Interval (简单树状数组)
    HDUOJ-----2838Cow Sorting(组合树状数组)
    HDUOJ---2642Stars(二维树状数组)
    HDUOJ -----Color the ball
    ACM遇到的问题与解决方案
    ELK架构下利用Kafka Group实现Logstash的高可用
    Linux给力的Shell命令
    i18n 语言码和对应的语言库
    jar启动脚本shell
    持续集成和部署工具GOCD
  • 原文地址:https://www.cnblogs.com/mthoutai/p/6940731.html
Copyright © 2011-2022 走看看