我并不打算在这里把所有的gradle
知识都介绍一遍, 毕竟我不没有全部掌握. 而且百度爸爸更懂你. 这里简单介绍一下文章中需要用的相关知识.
使用关键字def
可以声明变量
def name = "name"
也可以像java
一样声明变量
String name = "name"
Gradle
使用的是 groovy
语言编写. 而groovy
支持动态类型, 所以声明变量的时候, 可以不指定类型. 编译器会自动识别类型.
需要注意的是: 如果我们在工程中使用
gradle
脚本(比如Android 工程
,Java 工程
), 变量是有作用域的.
通常用def
声明的变量, 无法在task
之间共享.
所以为了能够在多个task
之间, 访问同一个变量.一般情况, 我都是用以下方法:
ext.name = "name"
这样声明的name
,就可以在task
之间互相访问.
ext
是工程(Project)
中才有的属性. 具体可以查看:org.gradle.api.Project#getExtensions
函数的声明和java
大致相同, 由于动态类型的加持, 所以可以不需要指定参数类型
和返回值类型
static def func(name, age){
...
函数体
...
return "name"
}
Gradle
更强大的功能在于Task
.
Gradle
为我们提供了很多Task Type
, 点击这里查看
不同的Task Type
对应不同的功能, 并且提供了相当简洁的API
调用, 可以很轻松完成相应的Task
.
声明Task
声明Task
, 和声明方法类似, 只不过def
关键字, 换成了task
关键字.
task test(){
...
}
请注意:
Gradle
是有生命周期的概念, 在task
执行之前, 都会有一个叫做配置阶段
的东西.
配置阶段
会把所有声明的task
都配置一遍, 但是不会执行. 所以在配置阶段
所有的变量
,task参数
都已经确定好了.
要修改他们, 只能在运行期, 动态设置.
Task的2个关键方法
test.doFirst{
...
}
test.doLast{
...
}
见名知意.
doFirst
会在task
执行前调用;可以用来真正执行耗时任务(比如网络请求), 或者动态修改task
执行参数.
doLast
会在task
执行后调用;可以用来收集返回值, 或者task
执行后的回调.
七牛云SDK 中, 有Java
语言的版本, 所以想着直接用SDK进行请求操作.
这里就要介绍一下Gradle
强大的Java
环境支持.
其实在gradle
文件中, 可以直接创建java
环境的下的所有对象, 而不需要import
类名.
但是, 当我们需要使用第三方SDK时, 怎么办呢?
这里已七牛云SDK
为例, 介绍一下, 如何在gradle
中使用第三方SDK的方法:
buildscript {
//配置仓库地址, 用来下载jar包
repositories {
jcenter()
}
//需要引入的jar包, (本人暂时没有测试本地jar的引入方式, 有试过的同学可以在评论区留言.)
dependencies {
classpath 'com.qiniu:qiniu-java-sdk:7.2.18'
}
}
以上配置之后, 当前的gradle
文件, 可以使用SDK
相关类. 跨文件需要重新配置, 方可访问.
所有源码如下:
import com.qiniu.*
import com.qiniu.storage.*
import com.qiniu.storage.model.*
import com.qiniu.util.*
import com.qiniu.http.*
import com.qiniu.common.*
import com.google.gson.*
/**
* 请无视IDEA的爆红, 并不影响运行.
*
* 请不要随意导入其他包.
* */
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.qiniu:qiniu-java-sdk:7.2.18'
classpath "com.google.code.gson:gson:2.8.5"
}
}
ext.qiniuConfig = [
//必填
"AccessKey" : "",
//必填
"SecretKey" : "",
//必填, 请填写对应的七牛的Bucket
"Bucket" : "download",
//必填, 可以是绝对路径, 也可以是相对于脚本所在的相对路径.
"apkPath" : "./ademo.apk",
//必填, 七牛下载域名前缀, 需要'/'结尾, 例如 "http://download.qiniu.com/"
"baseUrl" : "",
//变量. 用来保存上传成功后, APK的下载地址.
"downloadUrl": ""
]
task _qiniuUpload() {
doFirst {
if (qiniuConfig.apkPath == null) {
throw IllegalStateException("请指定上传的文件")
}
def apkFile = file(qiniuConfig.apkPath)
if (!apkFile.exists()) {
throw IllegalStateException("需要上传的文件不存在:" + apkFile.getAbsolutePath())
}
//创建上传凭证, 这是必须的.
def auth = Auth.create(qiniuConfig.AccessKey, qiniuConfig.SecretKey)
def key = apkFile.name
def putPolicy = new StringMap()
putPolicy.put("returnBody", "{\"key\":\"" + key + "\", \"hash\":\"" + System.currentTimeMillis() + "\"}")
def expireSeconds = 3600L
String upToken = auth.uploadToken(qiniuConfig.Bucket, null, expireSeconds, putPolicy)
println "七牛云上传凭证:" + upToken
//UploadManager uploadManager = new UploadManager()
//Auth auth = Auth.create(accessKey, secretKey)
//String token = auth.uploadToken(bucketName)
//Response r = upManager.put("hello world".getBytes(), "yourkey", token)
def downloadUrl = qiniuConfig.baseUrl + key
println "开始上传:" + apkFile.getAbsolutePath() + "->" + downloadUrl
//上传本地文件
def cfg = new Configuration(Zone.zone0())
def uploadManager = new UploadManager(cfg)
def response = uploadManager.put(apkFile, key, upToken)
def putRet = new Gson().fromJson(response.bodyString(), DefaultPutRet.class)
qiniuConfig.downloadUrl = downloadUrl
println "七牛云上传成功->" + qiniuConfig.downloadUrl
}
}
执行:
gradlew _qiniuUpload
就可以上传apkPath
指定的本地文件
群内有各(pian)种(ni)各(jin)样(qun)
的大佬,等你来撩.
点此快速加群
请使用QQ扫码加群, 小伙伴们都在等着你哦!
关注我的公众号, 每天都能一起玩耍哦!