不知道大家有没有类似的困扰,你的工程assets文件过大,我曾经在某度车机地图团队工作过一段时间时候,每次发包会集成一个上百MB的文件。工作一段时间你的git仓库将会增加特别多。最后,你会发现你如果重新git clone这个仓库会非常大,好几G。当时我没有想到好办法。
拓展:虽然可以通过
git clone xxx --depth=1
来只check out最新的。但是commits又不太好出现。虽然我还有–unsallow的办法…始终不太好弄。
但是现在我工作的团队,也有类似的,每次发包或者debug包都可能需要更新某个zip包,好几十MB。
现在,我找到了一个好办法:
第1步:
将你的文件上传到内网,得到一些地址,比如:
http://11.11.1.11:8888/packages/works/xxx.zip
http://11.11.1.11:8888/packages/works/yyy.mp4
...
第2步:
编写app/build.gradle的编译前脚本:
2.1 编译前下载
def zipFile = 'http://:8888/packages/2.11.11/web-200.5.zip'
def featureMp4s = ['http://3344/packages/feature_2041.mp4', 'http://8888/packages/feature_3223.mp4']
// 自定义下载文件的任务
tasks.register('downloadFile') {//保持同名
doLast {
downloadFileFun(zipFile, null) { File file->
return file.name.endsWith("zip") && file.name.contains("web-")
}
featureMp4s.forEach {
if (!it.trim().isEmpty()) {
downloadFileFun(it, featureMp4s) { File file->
return file.name.endsWith("mp4") && file.name.contains("feature_")
}
}
}
}
}
// 将 downloadFile 任务作为 preBuild 的依赖
tasks.named('preBuild').configure {
dependsOn tasks.named('downloadFile')//保持同名
}
2.2 下载函数
//matchFileChecker会给你传递file。你返回true表示此类文件是符合我们需要下载的类型文件, 也避免将其他文件删除。
def downloadFileFun(String url, List<String> needDownAllUrls, Closure matchFileChecker) {
var downloadDir = file("src/main/assets") //自行修改文件位置,或者提取成变量
var downloadUrlFileName = url.substring(url.lastIndexOf("/") + 1)
var outputFile = file(downloadDir.absolutePath + File.separator + downloadUrlFileName)
println("build: download file..." + downloadUrlFileName)
// 确保目标文件夹存在
if (!downloadDir.exists()) {
throw new RuntimeException("build: download file error.")
}
var files = downloadDir.listFiles()
var hasFile = false
for (file in files) {
if (matchFileChecker.call(file)) { //符合我们需要下载的类型文件, 也避免将其他文件删除。
if (file.name == downloadUrlFileName) {
hasFile = true
} else {
//追加一个需要下载的全列表,这样避免删除`兄弟`文件。
if (needDownAllUrls == null || !needDownAllUrls.collect {it.substring(it.lastIndexOf("/") + 1)}.contains(downloadUrlFileName)) {
file.delete()
println "build: DELETE " + file
} else {
println "build: don't delete " + file
}
}
}
}
if (!hasFile) {
println "build: Downloading file from $url..."
new URL(url).withInputStream { input ->
outputFile.withOutputStream { output ->
output << input
}
}
println "build: Download completed: $outputFile\n"
} else {
println "build: File already exists: $outputFile\n"
}
Thread.sleep(100)
}
后续你只需要更改zipFile ,featureMp4s 变量(当然你最好自行改名参考实现)即可。这样的话,你只更新了1-2句代码,而不是更新压缩包。git仓库得到了拯救。
同时切分支,切commit,倒退回去的时候,也能正常下载,也能查到当时的zip链接,找到之前的对应版本。