Gradle小抄

一、了解

gradle是个什么东西,一开始的时候我并没有一个很深的概念要去了解,完全当它是个工具来用,而Google就是用户手册。刚开始还好,到后面就不行了,遇到一些问题,莫名其妙,简直烦炸!至此,我开始了解gradle

就像常说的,gradle是个构建工具,它作为一个新起之秀,有ant,maven等前辈。那构建工具用来干什么的?

顾名思义:构建工具是用来将项目源代码进行build,然后得到output的一个工具。(所以用不好就会烦炸,明明源代码啥都有,就是得不到output,想想就害怕)。那么这些个构建工具有什么区别,从一片知乎上看到,ant是朴素的,任务清晰,当时不管理依赖。maven是厉害的,他管理依赖,但是不太灵活。最后就有了gradle,我的需求,他都可以满足:构建,打包,依赖管理,项目配置,等等。

重点来了,对于一个构建工具,我们要注意什么?在我开来,第一是构建脚本,第二是项目配置结构,第三是命令使用。清楚他的构建脚本,知道他会干什么,如何定义,然后就是项目结构,如何配置才能让项目能顺利构建,最后就是对各种命令的使用,充分发挥构建工具的作用了。

最后,我是个android开发者,常常用到gradle,也是官方默认的管理工具,就只能去用了。还有就是,他是基于jvm运行的,这是前提。

二、入手

入手的方式有两种:一种是手动创建一个gradle管理的项目,一种是拿到一个gradle管理的项目。

显然,自己创建的方式需要预先安装好gradle,无论是使用IDE的集成,还是使用命令行,一般都不会遇到什么问题,毕竟东西都是自己控制的。就不说啥了。

所以,重点就是拿到一个gradle的项目。gradle神奇的地方在于,即使你没有预先安装gradle,也可以使用它,因为他常常会带一个jar,来让那些没有gradle的环境去下载,然后使用。当然,这也是个坑,为什么,在后续的wrapper里明说,总的就是,我有个新版的gradle,你竟然去下载旧的,还巨慢!

使用Android Studio的同学相必早已在电脑有了gradle,当然,我们可以在gradle官网,去下载使用。官网还有许多docs,很有帮助。

至于说什么基于groovy的,作为一个程序员,代码简直简单到看不懂都好难,所以,直接上手吧,边摸索边学习即可。

三、见面

在Windows平台,一般一个由gradle管理的项目大概会有这么些个东西。

首先来看文件夹:.gradle(‘.’开头的都不好惹),build(执行过后常常将输出或者缓存放到这个文件夹),gradle(管理自己的地方),src(我们的源代码)

再看文件,大致可以分为3类:构建脚本(后缀为gradle),执行文件(gradlew和gradlew.bat),配置文件(后缀为properties)。显然,配置文件不是必须的,所以不同项目不同,而这里的local.properties就是Android SDK的目录设置配置。

所以,我们要关注的,就基本上是脚本而已。当然,文件夹gradle和配置文件是基础。也就是3个方面。

  1. 在脚本(*.gradle)里我们定义任务,管理依赖。
  2. 在文件夹gradle里我们管理不同版本的gradle,包括下载,升级等。
  3. 在配置文件里我们管理gradle运行时的属性,包括执行环境的一切(jvm设置,sdk路径等)

四、避坑

在使用前,当然要了解一些最基本的坑,不然可能艰难爬过了,后面又掉进去而不知道。

4.1、wrapper

在gradle文件夹里的就是这个,他是个管理gradle的东西,包括从无到有,版本选择,版本升级等。

重点:

gradle/wrapper/gradle-wrapper.properties

distributionUrl=https\://services.gradle.org/distributions/gradle-4.3.1-bin.zip

类似上面的就是要注意的地方,很多时候,我们本地没有它指定的版本,然后他就会去下载指定的版本,所以,我们把对应的版本号做好统一,避免去下载n多个版本,直接替换4.3.1为自己的版本号即可。

4.2、local.properties

本来这不是个坑,但是一不小心就会遇到,目前我只遇到,用它来设置本地Android SDK目录的时候,但是,有时候一些第三方的项目就没有这个文件,如果用Android Studio他会帮我们加上去,但是用命令行时就坑爹了。下面mark一下:

## This file must *NOT* be checked into Version Control Systems,
# as it contains information specific to your local configuration.
#
# Location of the SDK. This is only used by Gradle.
# For customization when using a Version Control System, please read the
# header note.
#Sat May 12 08:39:04 CST 2018
ndk.dir=D\:\\sdk\\ndk-bundle
sdk.dir=D\:\\sdk

显然,后面的路径要根据各位同学本地的sdk来设置。

五、开始

终于来到正式的地方了,正正经经的使用。我们可以选择使用IDE提供的工具栏或者使用命令行。两种方式都会说一下,当然,IDE使用的本质也是命令行了,所以,命令行才是本质。

说明:当使用wrapper时,命令换成gradlew,能更新或者下载wrapper配置里的gradle然后使用

概念:project和task,project有一个或多个task或字project构成,task是gradle的最小执行单元。而在“见面”里的setting.gradle里,就是来声明project包括了那些子project的。task在build.gradle里定义。

其实,本文目的并不单纯,下面的大多都是结合Android Studio和android plugin来讲述的,毕竟我是做Android的。

5.1、gradle in Android Studio


以上就是在android studio里提供的task的列表,我们只需要双击就能使用,下面简单介绍一下。

呃呃呃,好像没啥好说的,唯一提一下的就是:assemble的意思是集合,打包之类的,显然,这就是个将所有东西编译,打包成运行文件的操作,具体后面说,其他的猜一下也差不多了,或者google一下,毕竟我也没用多少。

补充一点,在android studio里的构建任务,可以参考官网里的构建

5.2、gradle in CLI(command line interface)

命令解释:

//命令格式,taskname可以多个,用space隔开
> gradle [taskName...] [--option-name...]

//多项目情况,如果是rootProject,则最前面的":"可以省略
> gradle :mySubproject:taskName

//环境路径基于的文件路径,上例等于如下
> cd mySubproject
> gradle taskName

//exclude task,如:不执行test
> gradle dist --exclude-task test

//失败后,继续task
> gradle test --continue

常见命令:

//assembling all outputs and running all checks
> gradle build

//running applications
> gradle run

//running all checks
> gradle check

//cleaning outputs
> gradle clean

//get report(在gradle 加-q 可以只输出核心内容,安静模式)
> gradle projects
> gradle tasks [--all]

//get task usage help
> gradle help --task someTask

//list dependencies
> gradle dependencies //对应dependencies
> gradle buildEnvironment //对应buildscript
> gradle dependencyInsight --dependency name //查看特定依赖

//list properties
> gradle properties 

//list models
> gradle model

加速构建:

--build-cache, --no-build-cache
reuse the outputs. Default is off.

--configure-on-demand, --no-configure-on-demand
Only relevant projects are configured in this build run. Default is off.

--parallel, --no-parallel
Build projects in parallel. Default is off.

//对于gradle的性能调优,可以加--profile生成执行时间报告

加速构建之gradle.properties设置:

org.gradle.parallel=(true,false)
org.gradle.configureondemand=(true,false)
org.gradle.caching=(true,false)
当然,在很多时候只需要配置好properties就可以定制很多特性了,全部请查看 gradle_configuration_properties


六、Android Plugin DSL

第一次体会到什么叫DSL(domain-specific language) ,像android plugin,他定义了很多只针对android项目的一些东西,然后在脚本里会用到(区别于一般的编程语言),所以,这种domain-specific当然是有reference啦(我是今天才发现,真是坑)Android Plugin DSL Reference

在官网里我们看到有大概十几个configration block,这都是定义好的,可以用来控制android项目的某些东西的。下面就几个常用的做一下介绍。当然了,要使用就要在root project里的buildscript里声明使用这个dependency(IDE自动弄好了,此处说明一下)。

6.1、概览

在Android项目里的build.gradle里,主要看android{},dependencies{},这两大块,而android{}里的就是这里的重点,其余都算是普通gradle的内容。

6.2、android{}
全局配置

直接在里面配置

android {
    compileSdkVersion 26
    ...
    ...
}

原来旧的版本还有个buildToolVersion的设置,后来更新了,直接有提供默认的设置了,就不同自行设置了,而一般我们就加这一个而已。

sourceSets{}
android {
	...
	...
    sourceSets{
		res.srcDirs = ['src']
		jni.srcDirs = ['jniLibs']
	}
	...
	...
}

一般遵循默认的设定,像java,res,assets,jniLibs都放在module/src/main/目录下,当然我们可以添加一些自己的文件夹到默认中,只需要在上面的[]里添加路径即可,用','分隔开。

defaultConfig{}
android {
	...
	...
    defaultConfig {
        applicationId "com.example.zyssky.interesting"
        minSdkVersion 21
        targetSdkVersion 26
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
	...
	...
}

在这里一般设置一些通用的,就像上面这种类型的,设置。

buildType{}
android {
	...
	...
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
	...
	...
}

这里是设置构建类型的自定义的,包括debug,release,自定义,还有就是各类型里的签名,资源压缩,proguard问题,包名设置等等的,就是用来区分分割构建类型的设置的,完了后会自动生成task:assemble***来执行对应任务。构建类型之间还能够继承:

如:myBuildType.initWith(buildTypes.debug)

signingConfigs{}
android {
	...
	...
    signingConfigs {
        release {
			storeFile file("path")
			storePassword "123456"
			keyAlias "rr"
			keyPassword "1234567"
		}
    }
	buildTypes {
		release{
			singingConfig signingConfigs.release
		}
	}
	...
	...
}

在配置完成后,再在buildTypes里设置就好。签名文件自己定义的是jks,不再是keystore了。

还有多渠道打包用到的productFlavour{},使用java特性时的compileOptions{},还有lint检查时的lintOptions{},具体使用根据具体场景,参考官网教程使用即可。

七、小结

这里我们没有做很多介绍一些用法,毕竟很多东西IDE都默认配好了,就是当出现问题或者需要自定义的时候,我们才会去着手,而这里也只是介绍了各自的职责,各个定义,以便有需要时该怎么办,可以怎么办,有个方向,而不是一昧地上网搜,却不知道该搜啥,也无法判断这是什么问题。东西很多,用法灵活,讲是不可能讲完的,所以了解一下,让自己能知道如何正确的走下去就是我的目标了。最后我们要与时俱进,一些关于gradle的更新(在Android Studio里的),记得查看官网更新report

注释:

依赖管理:一个项目可能会用到第三发的库,之前我们或许会采用手动添加jar或之类等的方式来支持这个依赖,而如果构建工具能进行依赖管理,就可以开源仓库中获取源代码,然后集成到项目,开发者只需要一两行来声明某个依赖即可。当然也能进行本地的依赖管理了。

参考:

【1】构建工具的进化:ant, maven, gradle

【2】Gradle 官网

【3】Android Plugin DSL Reference

【4】Build In Android Studio

【5】Gradle Release In Android Studio

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
GeoPandas是一个开源的Python库,旨在简化地理空间数据的处理和分析。它结合了Pandas和Shapely的能力,为Python用户提供了一个强大而灵活的工具来处理地理空间数据。以下是关于GeoPandas的详细介绍: 一、GeoPandas的基本概念 1. 定义 GeoPandas是建立在Pandas和Shapely之上的一个Python库,用于处理和分析地理空间数据。 它扩展了Pandas的DataFrame和Series数据结构,允许在其中存储和操作地理空间几何图形。 2. 核心数据结构 GeoDataFrame:GeoPandas的核心数据结构,是Pandas DataFrame的扩展。它包含一个或多个列,其中至少一列是几何列(geometry column),用于存储地理空间几何图形(如点、线、多边形等)。 GeoSeries:GeoPandas中的另一个重要数据结构,类似于Pandas的Series,但用于存储几何图形序列。 二、GeoPandas的功能特性 1. 读取和写入多种地理空间数据格式 GeoPandas支持读取和写入多种常见的地理空间数据格式,包括Shapefile、GeoJSON、PostGIS、KML等。这使得用户可以轻松地从各种数据源中加载地理空间数据,并将处理后的数据保存为所需的格式。 2. 地理空间几何图形的创建、编辑和分析 GeoPandas允许用户创建、编辑和分析地理空间几何图形,包括点、线、多边形等。它提供了丰富的空间操作函数,如缓冲区分析、交集、并集、差集等,使得用户可以方便地进行地理空间数据分析。 3. 数据可视化 GeoPandas内置了数据可视化功能,可以绘制地理空间数据的地图。用户可以使用matplotlib等库来进一步定制地图的样式和布局。 4. 空间连接和空间索引 GeoPandas支持空间连接操作,可以将两个GeoDataFrame按照空间关系(如相交、包含等)进行连接。此外,它还支持空间索引,可以提高地理空间数据查询的效率。
SQLAlchemy 是一个 SQL 工具包和对象关系映射(ORM)库,用于 Python 编程语言。它提供了一个高级的 SQL 工具和对象关系映射工具,允许开发者以 Python 类和对象的形式操作数据库,而无需编写大量的 SQL 语句。SQLAlchemy 建立在 DBAPI 之上,支持多种数据库后端,如 SQLite, MySQL, PostgreSQL 等。 SQLAlchemy 的核心功能: 对象关系映射(ORM): SQLAlchemy 允许开发者使用 Python 类来表示数据库表,使用类的实例表示表中的行。 开发者可以定义类之间的关系(如一对多、多对多),SQLAlchemy 会自动处理这些关系在数据库中的映射。 通过 ORM,开发者可以像操作 Python 对象一样操作数据库,这大大简化了数据库操作的复杂性。 表达式语言: SQLAlchemy 提供了一个丰富的 SQL 表达式语言,允许开发者以 Python 表达式的方式编写复杂的 SQL 查询。 表达式语言提供了对 SQL 语句的灵活控制,同时保持了代码的可读性和可维护性。 数据库引擎和连接池: SQLAlchemy 支持多种数据库后端,并且为每种后端提供了对应的数据库引擎。 它还提供了连接池管理功能,以优化数据库连接的创建、使用和释放。 会话管理: SQLAlchemy 使用会话(Session)来管理对象的持久化状态。 会话提供了一个工作单元(unit of work)和身份映射(identity map)的概念,使得对象的状态管理和查询更加高效。 事件系统: SQLAlchemy 提供了一个事件系统,允许开发者在 ORM 的各个生命周期阶段插入自定义的钩子函数。 这使得开发者可以在对象加载、修改、删除等操作时执行额外的逻辑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值