Gradle7.x学习篇03 - 认识Project

Project是什么?

每次Gradle构建必定由一个或多个project参与,Gradle的基本执行单元是task,而task则是在project中定义并维护的。

在一个简单的目录下新建一个build.gradle的文件,这个脚本在运行的时候就会定义一个project和一些task。比如在一个first_gradle目录下,新建一个空白的build.gradle,在控制台执行: gradle projects

> Task :projects

------------------------------------------------------------
Root project 'first_gradle'
------------------------------------------------------------

Root project 'first_gradle'
No sub-projects

To see a list of the tasks of a project, run gradle <project-path>:tasks
For example, try running gradle :tasks

可以一个root project,名称是当前的目录名称;一个简单的修改project名称的方式是在同级目录下新建一个settings.gradle文件,文件内容:

rootProject.name = "myProject"

再次执行gradle projects,可以看到这个project名称变成了myProject

# gradle projects
> Task :projects

------------------------------------------------------------
Root project 'myProject'
------------------------------------------------------------

Root project 'myProject'
No sub-projects

在build.gradle脚本中可以使用this指向当前的project,可以通过this访问当前project的属性,也可以省略this。

println "this:\"$this\""
println "-"*30
println tasks.each{it -> println it}

从输出结果可以看到已经定义了一部分task,之前在命令行执行的gradle projects其实也是执行其内建的task

this:"root project 'myProject'"
------------------------------
task ':buildEnvironment'
task ':components'
task ':dependencies'
task ':dependencyInsight'
task ':dependentComponents'
task ':help'
task ':init'
task ':javaToolchains'
task ':model'
task ':outgoingVariants'
task ':prepareKotlinBuildScriptModel'
task ':projects'
task ':properties'
task ':tasks'
task ':wrapper'

Project有什么?

标准的Project有很多属性和方法,除了标准的属性和方法,Gradle内建了很多插件也提供了各种各样适用不同场景的属性方法。

标准Project 属性

这里列举几个实用的标准属性,更多可以参考官网API

  • ant: AntBuilder 实例,可以通过提供的API操作Ant Project
    建立一个简单的ant配置build.xml,其内容如下:
    <?xml version="1.0"?>
       <project name="Hello World Project">
       <target name="sayHello">
          <echo>Hello World - Welcome to Apache Ant!</echo>
       </target>
    </project>
    
    Gradle提供了一部分API来通过ant实例来操作ant相关的对象,也可以通过ant自己的project来更加细致的进行配置或执行任务,比如:
    tasks.register("testAnt"){
        doLast{
            ant.importBuild(file("build.xml"))
            println ant.getProject().getName()
            println ant.getProject().getTargets()
            ant.getProject().executeTarget("sayHello")
        }
    }
    
    Hello World Project
    [sayHello:sayHello]
    [ant:echo] Hello World - Welcome to Apache Ant!
    
  • logger 用来打印日志的,可以通过它来打印不同级别的日志
    logger.info("hello for info")
    logger.quiet("date:{}","2021-10-21")
    
  • buildDir 项目生成的artifacts 都会在这里,默认projectDir/build
  • groupnameversion, 可以定位一个组件
  • rootDir:项目的根目录
  • tasks:TaskContainer的实例,也是创建任务比较重要的属性

标准Project 方法

这里也是列举几个常用的方法:

  • allprojects(action),用来配置project和子project
  • apply 方法,用来应用脚本或者插件
  • artifacts(configureAction) 用来配置生成的组件
  • configure方法,可以用来配置一组对象
  • copy 方法
    copy {
       from configurations.runtimeClasspath
       into 'build/deploy/lib'
    }
    
  • defaultTasks 定义默认任务,当没有指定task的时候,默认任务将会执行
  • delete 删除文件
    tasks.register("deleteFile"){
        doLast{
            project.delete {
                logger.quiet("delete file")
                delete 'desc/test.txt'
                followSymlinks = true
            }
        }
    }
    
  • exec 运行可执行程序
    tasks.register("execCommand"){
        doLast{
            project.exec {
                executable "java"
                args "-version"
            }
        }
    }
    
    # gradle execCommand
    > Task :execCommand
    java version "1.8.0_231"
    Java(TM) SE Runtime Environment (build 1.8.0_231-b11)
    Java HotSpot(TM) 64-Bit Server VM (build 25.231-b11, mixed mode)
    
    或者
    tasks.register("execCommand"){
        doLast{
            project.exec{
                commandLine("javac","-version")
            }
        }
    }
    
  • file(path),获取指定路径的文件对象
  • javaexec,可运行Java程序,指定classpath,mainClass等等
  • mkdir 创建目录
  • sync 同步文件,跟copy很像,但是在复制前会删除目标中的所有,除非指定preserve
  • tarTree,根据指定路径创建TAR文件
  • task,可以用来创建任务
  • zipTree,根据指定路径创建 ZIP文件

Gradle标准的Project提供听丰富的方法,其外还可以通过引入插件来使用额外添加的更强大的方法。

标准Project的Script blocks

跟方法重复的一些不再介绍,这里也列举几个标准Project所具有的,其他插件添加到到后面在看:

  • buildscript
    当我们的构建脚本本身需要额外的组件的时候,可以通过它来添加第三方库
    import com.google.common.primitives.Ints
    import com.google.common.collect.Lists
    
    buildscript {
        repositories {
            maven {
                url "https://maven.aliyun.com/repository/central"
            }
        }
        dependencies {
            classpath group: 'com.google.guava', name: 'guava', version: '31.0.1-jre'
        }
    }
    
    tasks.register("testGuava"){
        doLast {
            List<Integer> countUp = getNumberList()
            printNumbers(countUp)
            printNumbers(Lists.reverse(countUp))
        }
    }
    
    List<Integer> getNumberList() {
        return Ints.asList(1, 2, 3, 4, 5);
    }
    
    void printNumbers(List<Integer> nums) {
        nums.forEach(t -> print t + "\t")
        println ""
    }	
    
    # gradle testGuava
    > Task :testGuava
    1       2       3       4       5
    5       4       3       2       1
    
  • dependencies
    项目构建的目标需要的依赖,具体到Java插件的时候再来了解
  • repositories
    定义所需组件的来源,具体到Java插件的时候再来了解

再来看下标准的Gradle提供的task, 其中没有用来编译打包用的task,后续需要通过插件来完成构建诸如构建Java 命令行程序,JavaEE项目等等

# gradle tasks --all
> Task :tasks

------------------------------------------------------------
Tasks runnable from root project 'test'
------------------------------------------------------------

Build Setup tasks
-----------------
init - Initializes a new Gradle build.
wrapper - Generates Gradle wrapper files.

Help tasks
----------
buildEnvironment - Displays all buildscript dependencies declared in root project 'test'.
dependencies - Displays all dependencies declared in root project 'test'.
dependencyInsight - Displays the insight into a specific dependency in root project 'test'.
help - Displays a help message.
javaToolchains - Displays the detected java toolchains.
outgoingVariants - Displays the outgoing variants of root project 'test'.
projects - Displays the sub-projects of root project 'test'.
properties - Displays the properties of root project 'test'.
tasks - Displays the tasks runnable from root project 'test'.

Other tasks
-----------
components - Displays the components produced by root project 'test'. [deprecated]
dependentComponents - Displays the dependent components of components in root project 'test'. [deprecated]
model - Displays the configuration model of root project 'test'. [deprecated]
prepareKotlinBuildScriptModel


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值