目前做的項(xiàng)目是用cocoapods管理依賴庫(kù)的载佳,cocoapods的好處這里就不細(xì)說(shuō)了。我們遇到的問(wèn)題在于SDK層也是依賴cocoapods進(jìn)行管理的蔑担,而單單一個(gè)SDK動(dòng)不動(dòng)就1~2個(gè)G傻铣,在開(kāi)發(fā)階段經(jīng)常一天有幾個(gè)版本需要迭代。那么導(dǎo)致cocoapods的緩存目錄在一個(gè)月內(nèi)就會(huì)漲到40G到50G肖方。對(duì)于小固態(tài)真的傷不起诀豁。
手動(dòng)清理是可以的,目錄是~/Library/Caches/CocoaPods/Pods/Release
窥妇,但是就是懶舷胜,且?guī)煲蔡啵苯影讶縿h掉的話,切一下分支可能又要重新下烹骨,麻煩翻伺,畢竟可能要下幾個(gè)G。所以打算寫(xiě)個(gè)腳本沮焕。
該腳本不會(huì)刪除最近7天的下載的版本吨岭,并且每個(gè)庫(kù)都會(huì)至少留3個(gè)版本。直接上代碼
#移動(dòng)文件到垃圾桶的方法
function moveToTrash() {
echo moveToTrash=$1
osascript << EOF
tell application "Finder"
posix path of ((delete posix file "$1") as unicode text)
end tell
EOF #這行一定要頂格寫(xiě)峦树,否則報(bào)錯(cuò)
}
echo "開(kāi)始清理Pods緩存"
leftCount=3 #剩余幾個(gè)
Release=~/Library/Caches/CocoaPods/Pods/Release
for dir in $(ls $Release | sed 's/ /_-_/g') #需要將空格先替換辣辫,否則空格會(huì)分割文件名來(lái)遍歷
do
originalDir="$(echo $dir | sed s'/_-_/ /g')"
libDir=$Release/$originalDir
if [ -d "$libDir" ]; then
allCount=$(ls "$libDir" | wc -l)
# echo allCount=$allCount
deleteCount=`expr $allCount - $leftCount`
# echo deleteCount=$deleteCount
if [ $deleteCount -gt 0 ]; then
noUseFiles=$(find "$libDir" -type d -ctime +7 | sed 's/ /_-_/g') #7天沒(méi)修改的文件
for deleteDir in $(ls -rt "$libDir" | head -n$deleteCount | sed "s:^:$libDir/: " | sed 's/ /_-_/g')
do
if [[ $noUseFiles =~ $deleteDir ]]; then
moveToTrash "$(echo $deleteDir | sed s'/_-_/ /g')"
fi
done
fi
fi
done
只要執(zhí)行一下這個(gè)腳本就行了。感覺(jué)很方便了魁巩。
但是還是懶急灭,再來(lái)個(gè)定時(shí)跑吧。這個(gè)時(shí)候需要用到mac的launchctl
使用launchctl定時(shí)跑清理腳本
首先我們需要寫(xiě)一個(gè)plist文件谷遂,然后把這個(gè)plist文件放到特定文件夾里面葬馋,當(dāng)系統(tǒng)登錄或者啟動(dòng)的時(shí)候就會(huì)跑了。
LaunchDaemons
--> 只要系統(tǒng)啟動(dòng)了肾扰,哪怕用戶不登陸系統(tǒng)也會(huì)被執(zhí)行
LaunchAgents
--> 當(dāng)用戶登陸系統(tǒng)后才會(huì)被執(zhí)行
具體的一些目錄
~/Library/LaunchAgents 由單個(gè)用戶自己定義的任務(wù)項(xiàng) 我是放這個(gè)目錄了畴嘶。
/Library/LaunchAgents 由管理員為用戶定義的任務(wù)項(xiàng)
/Library/LaunchDaemons 由管理員定義的守護(hù)進(jìn)程任務(wù)項(xiàng)
/System/Library/LaunchAgents 由Mac OS X為用戶定義的任務(wù)項(xiàng)
/System/Library/LaunchDaemons 由Mac OS X定義的守護(hù)進(jìn)程任務(wù)項(xiàng)
上plist代碼,記得把下面的注釋刪掉才行
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>com.bigo.deletePodsCache.plist</string> // 文件label集晚,需要唯一
<key>ProgramArguments</key>
<array>
<string>~/Documents/eksh/deletePodsCache.sh</string> // 需要跑的腳本絕對(duì)路徑
</array>
<key>StartInterval</key> // 單位是秒窗悯,測(cè)試發(fā)現(xiàn)最小是10秒。使用StartCalendarInterval 可以指定時(shí)間偷拔,具體的可以查看一下其他的配置文件蟀瞧,照貓畫(huà)虎就行
<integer>1728000</integer>
<key>StandardOutPath</key> // 標(biāo)準(zhǔn)輸出文件
<string>~/Documents/eksh/deletePodsCache.log</string>
<key>StandardErrorPath</key> // 錯(cuò)誤輸出文件
<string>~/Documents/eksh/deletePodsCache.log</string>
</dict>
</plist>
把plist文件放到上述的LaunchAgents
文件夾之后,終端運(yùn)行命令条摸,就行了悦污。
launchctl load -w path_of_plist_file
但怎么說(shuō),團(tuán)隊(duì)開(kāi)發(fā)的時(shí)候钉蒲,清理腳本好分發(fā)切端,但是這個(gè)定時(shí)任務(wù)配置卻有點(diǎn)麻煩,如果要寫(xiě)個(gè)腳本去配置顷啼,也不是不行踏枣。但就是懶,有木有更快更省力的方法钙蒙?有茵瀑,post_install。把清理腳本加入到podfile里面去就行了躬厌。每次pod intall之后马昨,就會(huì)跑,這樣就容易擴(kuò)展到團(tuán)隊(duì)了。
放上腳本代碼
post_install do |installer|
if File.exist?("清理腳本文件路徑") == true then
system("sh 清理腳本文件路徑")
end
end
本以為這樣就完事了鸿捧,但是實(shí)際發(fā)現(xiàn)有些問(wèn)題屹篓,清理腳本里面是使用osascript
給Finder發(fā)送命令的,但是pod install的時(shí)候感覺(jué)是ruby的腳本環(huán)境匙奴,運(yùn)行這種發(fā)送命令會(huì)特別慢(終端運(yùn)行腳本卻不會(huì))堆巧,有木有高手指點(diǎn)一下其中迷津?所以無(wú)奈之下泼菌,只能把移動(dòng)到廢紙婁的方法改為了mv $1 ~/.Trash
谍肤,但這種方式會(huì)丟失廢紙婁文件放回原處的命令。
寫(xiě)在最后哗伯,把podfile腳本推送到遠(yuǎn)端之后荒揣,發(fā)現(xiàn)一個(gè)問(wèn)題,因?yàn)轫?xiàng)目是用Jenkins進(jìn)行持續(xù)集成的笋颤,這個(gè)腳本會(huì)導(dǎo)致Jenkins在打包的時(shí)候,機(jī)器上的緩存也被清理.....