• Gradle之属性Properties


    每个Project和Task实例都提供了setter和getter方法来访问属性,属性可以是任务的描述或者项目的版本号。
    properties其实是Java项目中的配置文件,不是Gradle独创的。又因为Gradle语法可以和Java进行混合使用,所以在Java项目上面使用properties文件的方式,在Gradle上面也可以使用。
    Gradle借用了这一点,所以内置了对gradle.properties的使用方式

    Project自带的属性

    Gradle在默认情况下已经为Project定义了很多属性,其中比较常用的有:
    project:Project本身对象
    name:Project的名字
    path:Project的绝对路径
    description:Project的描述信息
    buildDir:Project构建结果存放目录
    version:Project的版本号
    属性都可以通过getter和setter方法来访问,也可以直接使用点好的形式来访问,例如:

    setDescription('myProject')
    println "Description of project $name: "+project.description
    
    • 1
    • 2

    当在build.gradle中访问属性和方法的时候,不需要使用project变量,它会假设你使用的是project实例。但是有一些情况需要注意,例如:

    version = 'this is the project version'
    description = 'this is the project description'
     
    task showProjectProperties << {
       println version
       println project.description
       println description
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    由于Task本身也有description属性,所以当在Task中,如果不显式的指定project,就会打印的是Task的description。这是因为定义Task的闭包将delegate设置成了当前的Task。有关delegate的介绍,我们可以看前一篇文章。
    Gradle还为我们提供了多种方法来自定义Project的Property。

    外部属性/额外属性

    外部属性一般存储在键值对中,要添加一个属性,你需要使用ext命名空间,看一个例子:

    //Only initial declaration of extra property requires you to use ext namespace
    project.ext.myProp = ‘myValue’
    ext {
    someOtherProp = 123
    }

    //Using ext namespace to access extra property is optional
    assert myProp == ‘myValue’
    println project.someOtherProp
    ext.someOtherProp = 567

    相似的,外部属性可以定义在一个属性文件中: 通过在/.gradle路径或者项目根目录下的 gradle.properties文件来定义属性可以直接注入到你的项目中,他们可以通过 project实例来访问,注意/.gradle目录下只能有一个 Gradle属性文件即使你有多个项目,在属性文件中定义的属性可以被所有的项目访问,假设你在你的gradle.properties文件中定义了下面的属性:

    exampleProp = myValue
    someOtherProp = 455

    你可以在项目中访问这两个变量:

    assert project.exampleProp == ‘myValue’

    task printGradleProperty << {
    println “Second property: $someOtherProp”
    }

    定义属性的其他方法

    你也可以通过下面的方法来定义属性:

    通过-P命令行选项来定义项目属性
    通过-D命令行选项来定义系统属性
    
    • 1
    • 2

    -D属性会被传送给启动Gradle的jvm,作为一个系统属性被jvm使用。
    -P属性则会被直接加载到Gradle领域对象上

    Gradle支持三种Properties

    System Properties:

    1.可通过gradle.properties文件,环境变量或命令行-D参数设置
    2.可在setting.gradle或build.gradle中动态修改,在setting.gradle中的修改对buildscript block可见;
    3.所有工程可见,不建议在build.gradle中修改
    4.多子工程项目中,子工程的gradle.properties会被忽略掉,只有root工程的gradle.properties有效
    我们可以使用 -D 的命令行 option 来给运行 Grade 的 JVM 传递 System properties 参数
    除了使用命令行,我们也可以在 gradle.properties 文件中添加 System properties,只需要加上systemProp.前缀:

    systemProp.gradle.wrapperUser=myuser
    systemProp.gradle.wrapperPassword=mypassword
    
    • 1
    • 2

    Project Properties:

    1.可通过gradle.properties文件,环境变量或命令行-P参数设置,优先级是:
    如果属性可能配置在多个位置,如下第一个找到的位置优先级最高。

    • command line, as set using the -P / --project-prop environment options.//使用命令行-P设置的属性

    • gradle.properties in GRADLE_USER_HOME directory. //GRADLE_USER_HOME的gradle.properties

    • gradle.properties in project root directory.// 根目录的gradle.properties

    • gradle.properties in Gradle installation directory. //Gradle安装目录的gradle.properties

    2.可在build.gradle中动态修改,但引用不存在的project properties会立即抛错
    3.动态修改过的project properties在buildscript block中不可见

    我们可以通过System properties 或者 Environment variables 添加一些自定义属性,Gradle 就可以将这些自定义属性添加到 Project 属性中。
    例如当我们设置了一个环境变量:ORG_GRADLE_PROJECT_prop=somevalue,那么 Gradle 就会设置一个名为 prop 的属性,它的值为 “somevalue”,注意这里的前缀ORG_GRADLE_PROJECT。Gradle 也支持通过设置 System properties 来给 Project 对象添加属性,只是属性的前缀不同,为:org.gradle.project。就像 org.gradle.project.prop,也可以给 Project 添加一个名为 prop 的属性

    Project ext properties:

    1.可在项目的build.gradle中声明和使用,本工程和子工程可见
    2.不能在setting.gradle中访问

    如果有多处设置,加载次序如下,后面的覆盖前面的设置
    1.from gradle.properties located in project build dir.
    2.from gradle.properties located in gradle user home.
    3.from system properties, e.g. when -Dsome.property is used in the command line.
    4.setting.gradle
    5.build.gradle

  • 相关阅读:
    操作系统 生产者--消费者问题
    HTTPS - 揭秘 TLS 1.2 协议完整握手过程--此文为转发文,一定要结合wirshark工具看,很清楚
    pandas 的基本使用
    (续)spring面试题
    MIPI CSI-2笔记(20) -- 建议的内存存储格式(Recommended Memory Storage)
    Unity游戏Mod/插件制作教程03 - 插件实例1: HelloWorld
    C++ 最长公共前缀
    【Spring】纯注解开发模式简直就是Spring中的Spring
    IMAU鸿蒙北向开发-2023年9月6日学习日志
    【每日一题】第一天
  • 原文地址:https://blog.csdn.net/caizehui/article/details/126214350