Gradle学习系列之五——自定义Property

学习了大佬的文章,感觉写的太好了,感谢大佬分享 ,可惜是gradle4.x的,升级为6.5。大佬博客地址 https://www.cnblogs.com/davenkin/p/gradle-learning-1.html


这是一个关于Gradle的学习系列,其中包含以下文章:
  1. Gradle快速入门
  2. 创建Task的多种方法
  3. 读懂Gradle语法
  4. 增量式构建
  5. 自定义Property
  6. 使用java Plugin
  7. 依赖管理
  8. 构建多个Project
  9. 自定义Task类型
  10. 自定义Plugin

请通过以下方式下载本系列文章的Github示例代码:

https://github.com/ZhangDi-d/gradle-learning.git

Gradle学习系列之五—— 自定义Project的Property

在前面的文章中我们讲到,设置和读取Project的Property是使用Gradle的一个很重要的方面。比如,很多Plugin都会向Project中加入额外的Property,在使用这些Plugin时,我们需要对这些Property进行赋值。

Gradle在默认情况下已经为Project定义了很多Property,其中比较常用的有:

project      Project本身
name         Project的名字
path         Project的绝对路径
description  Project的描述信息
buildDir     Project构建结果存放目录
version      Project的版本号

以下,我们首先设置Project的version和description属性,再定义showProjectProperties打印这些属性:

version = 'this is the project version'
description = 'this is the project description'
task showProjectProperties  {
    doLast {
        println version
        println project.description
    }
}

请注意,在打印description时,我们使用了project.description,而不是直接使用description。原因在于,Project和Task都拥有description属性,而定义Task的闭包将delegate设置成了当前的Task,故如果直接使用description,此时打印的是showProjectProperties的description,而不是Project的,所以我们需要显示地指明project。有关delegate的更多知识,请参考本系列的上一篇文章。

Gradle还为我们提供了多种方法来自定义Project的Property。

(1)在build.gradle文件中定义Property

在build.gradle文件中向Project添加额外的Property时,我们并不能直接定义,而是应该通过ext来定义。比如如果要添加一个名为property1的Property,我们可以:

ext.property1 = "this is property1"

另外,我们也可以通过闭包的方式:

ext {
    property2 = "this is property2"
}

在定义了Property后,在使用这些Property时我们则不需要ext,而是可以直接访问:

task showProperties{
    doLast {
        println property1
        println property2
    }
}

事实上,任何实现了ExtensionAware接口的Gradle对象都可以通过这种方式来添加额外的Property。

(2)通过命令行参数定义Property

Gradle还提供了-P命令行参数来设置Property,比如:

task showCommandLieProperties{
    doLast{
        println property3
    }
}

在执行“gradle showCommandLieProperties”时,终端输出如下:

* What went wrong:
Execution failed for task ':showCommandLieProperties'.
> Could not get unknown property 'property3' for task ':showCommandLieProperties' of type org.gradle.api.DefaultTask.

表示property3并没有被定义,在调用gradle命令时,通过-P参数传入该Property:

gradle -Pproperty3="this is property3" showCommandLieProperties

此时终端显示:

> Task :showCommandLieProperties
this is property3

BUILD SUCCESSFUL in 634ms

(3)通过JVM系统参数定义Property

我们知道,在java中,我们可以通过-D参数定义JVM的系统参数,然后在代码中可以可以通过System.getProperty()进行获取。在Gradle中,我们也可以通过-D的方式向Project传入
Property,只是此时我们需要遵循一些约定:每一个通过-D方式声明的Property都需要以“org.gradle.project”为前缀,对于上面的showCommandLieProperties,我们也可以通过以下方式
为property3设置:

gradle -Dorg.gradle.project.property3="this is another property3" showCommandLieProperties

(4)通过环境变量设置Property

我们还可以通过设置环境变量的方式为Project定义Property。这种方式和(3)一样,需要我们遵循一些约定:在定义环境变量时,每一个Property都需要以“ORG_GRADLE_PROJECT_”为前缀:

export ORG_GRADLE_PROJECT_property3="this is yet another property3"

在调用showCommandLieProperties时,我们便不需要传入命令行参数了:

gradle showCommandLieProperties

在笔者所工作的项目中,我们的持续集成服务器便是通过这种方式向Gradle定义Property的。

你可能感兴趣的:(gradle,gradle)