如何利用iCloud Drive同步Xcode配置詳解
前言
多年以前一位老程序員告訴筆者代碼片段(code snippets)是程序員的財(cái)富,他有一個(gè)U盤,里面裝著他的財(cái)富。每當(dāng)他需要切換電腦寫(xiě)代碼的時(shí)候,他就會(huì)把把精心配置的字體、主題、代碼片段等部署到新電腦上,然后開(kāi)始高速編碼。每次看他寫(xiě)代碼都是一種享受,不過(guò)這是另一個(gè)故事了。
需求
多年之后,筆者也終于湊夠了錢買了自己的Mac,閑暇無(wú)事的時(shí)候也會(huì)寫(xiě)寫(xiě)代碼祭奠下逝去的青春。但是某些時(shí)候總會(huì)覺(jué)得很別扭,例如感覺(jué)字體和單位的有細(xì)小的差距,或者一個(gè)代碼片段怎么也按不出來(lái)——最后發(fā)現(xiàn)是沒(méi)有在這臺(tái)電腦配置這段代碼片段。這種事發(fā)生的事情多了之后,就會(huì)感覺(jué)厭煩,同樣的操作為什么得重復(fù)兩次、三次?或者拿出吃了幾年灰的U盤抽插在各地的電腦上人工同步?就不能有什么辦法可以一次更改多次應(yīng)用?筆者稍微一拍腦門,想到了今天的主角——iCloud Drive
1、為什么使用iCloud Drive?
因?yàn)檫@是蘋(píng)果本家的網(wǎng)盤,嵌入系統(tǒng)中,只要開(kāi)啟我們就無(wú)需關(guān)心上傳下載,正如OneDrive在Windows一樣,我們只需要把文件放進(jìn)去,他就會(huì)自動(dòng)開(kāi)始上傳,并在你的每一臺(tái)蘋(píng)果設(shè)備上同步。利用這點(diǎn)我們就能方便的做到在不同的設(shè)備上同步Xcode配置文件,無(wú)需手動(dòng)同步或者上傳下載。
2、其他的替代方案
GitHub之類的大型同性交友網(wǎng)站
目前想來(lái)用git應(yīng)該更好更方便,不過(guò)實(shí)現(xiàn)起來(lái)有點(diǎn)復(fù)雜,有能力的朋友可以自己動(dòng)手
OneDrive/堅(jiān)果云等網(wǎng)盤
我覺(jué)得能有自帶的還是用自帶的吧
思路
總所周知Xcode的代碼片段是保存在~/Library/Developer/Xcode/UserData/CodeSnippets路徑下的,附近位置還有主題等配置信息。基于筆者的經(jīng)驗(yàn)我們只需要備份同級(jí)目錄下的CodeSnippets、FontAndColorThemes和KeyBindings三個(gè)子目錄就行了。每當(dāng)我們修改了代碼片段、主題或者快捷鍵,把對(duì)應(yīng)的文件放在iCloud Drive同步,當(dāng)在其他電腦上時(shí)就使用最新的覆蓋到對(duì)應(yīng)目錄即可。
腳本
雖說(shuō)思路如此,但是筆者肯定不敢把這種三歲小孩子就能分析出來(lái)的東西發(fā)出來(lái)糊弄人。所以為了簡(jiǎn)化這個(gè)繁瑣而又機(jī)械的操作,筆者編寫(xiě)了這樣一個(gè)腳本:
#!/usr/bin/env bash set -euo pipefail ################# variable define ########## now=`date "+%Y%m%d%H%M%S"` red=`tput setaf 1` green=`tput setaf 2` yellow=`tput setaf 3` reset=`tput sgr0` xcode_dir="${HOME}/Library/Developer/Xcode/UserData" cloud_backup_dir="${HOME}/Library/Mobile Documents/com~apple~CloudDocs/XcodeBackup" local_backup_dir="${HOME}/資源/歸檔/XcodeBackup" code_snippets="CodeSnippets" font_and_color_themes="FontAndColorThemes" key_bindings="KeyBindings" ########### MAIN ################## # check directory exist if [ ! -d "${cloud_backup_dir}" ]; then echo "${red}iCloud Drive備份路徑不存在!${reset}" mkdir -p "${cloud_backup_dir}" echo "${green}自動(dòng)創(chuàng)建iCloud Drive備份路徑:${reset}${cloud_backup_dir}" else echo "${green}iCloud Drive備份路徑:${reset}${cloud_backup_dir}" fi if [ ! -d "${local_backup_dir}" ]; then echo "${red}本地備份路徑不存在!${reset}" mkdir -p "${local_backup_dir}" echo "${green}自動(dòng)創(chuàng)建本地備份路徑:${reset}${local_backup_dir}" else echo "${green}本地備份路徑:${reset}${cloud_backup_dir}" fi # zip files cd "${xcode_dir}" zip -r "${cloud_backup_dir}/XcodeBackup+${now}.zip" "${code_snippets}" "${font_and_color_themes}" "${key_bindings}" & zip -r "${local_backup_dir}/XcodeBackup+${now}.zip" "${code_snippets}" "${font_and_color_themes}" "${key_bindings}" & wait # delete unnecessary backup files num=`ls -l "${cloud_backup_dir}" |grep "^-"|wc -l` if [ ${num} -gt 5 ]; then num=`expr ${num} - 5` cd "${cloud_backup_dir}" ls -tr "${cloud_backup_dir}" | head -${num} | xargs rm fi num=`ls -l "${local_backup_dir}" |grep "^-"|wc -l` if [ ${num} -gt 5 ]; then num=`expr ${num} - 5` cd "${local_backup_dir}" ls -tr "${local_backup_dir}" | head -${num} | xargs rm fi
簡(jiǎn)化了這個(gè)繁瑣的操作,僅需在開(kāi)機(jī)的時(shí)候跑一下,就能達(dá)到自動(dòng)備份的效果。功能也是十分的簡(jiǎn)單:
- 首先創(chuàng)建了兩個(gè)備份Xcode配置文件的路徑,一個(gè)在云端,一個(gè)在本地(本地路徑大家可以自行配置,一般也不會(huì)用上)。
- 然后把Xcode歸檔到這兩處各一份,筆者這里選用zip包而不是更高壓縮比的7zip等是因?yàn)橄胱鐾ㄓ靡稽c(diǎn)便于大家開(kāi)箱即用,不需要額外安裝其他軟件。
- 最后將多次運(yùn)行后生成的老包刪除,只保留最新的5個(gè),以便節(jié)約寶貴的空間(畢竟筆者比較窮只舍得用免費(fèi)的5g版)
有了這個(gè)腳本之后,大家只需要堅(jiān)持開(kāi)機(jī)的時(shí)候跑一跑就行了。筆者喜歡每天開(kāi)機(jī)就更新下cocoapods、brew、brew cask這類的,所以就寫(xiě)了個(gè)腳本,剛好順便也就備份一下。腳本思路大致如下,因?yàn)楹椭黝}無(wú)關(guān)就不細(xì)說(shuō)了。
#!/usr/bin/env bash open 自用魔法絲襪之影 wait pod repo update --verbose & 更新Homebrew cask & 備份各種幣錢包 & 備份Xcode等IDE配置文件 & wait killall 自用魔法絲襪之影
不過(guò)這樣其實(shí)也不是很方便,畢竟打開(kāi)terminal輸入指令都很煩了,難道還要手動(dòng)計(jì)算這臺(tái)電腦的配置是否是最新的?然后再考慮是不是需要把云盤里面的配置解壓到指定的位置覆蓋?而且很有可能在做這些前已經(jīng)把這臺(tái)電腦的配置當(dāng)最新版上傳到云盤里了。
讓所有的電腦用同一個(gè)版本的配置
筆者再次進(jìn)行了思考。如果可以根據(jù)這些文件的最后修改日期和備份的文件進(jìn)行比較,誰(shuí)新就用哪個(gè)版本,那么不就實(shí)現(xiàn)了嗎?只要我們確保每次修改都跑一次腳本,每次開(kāi)機(jī)都跑一次,就能達(dá)到我們想要的效果了。至于如何判斷文件的最后修改時(shí)間,筆者認(rèn)為只需要一個(gè)根據(jù)文件名生成的key和一個(gè)對(duì)應(yīng)的文件的最后修改時(shí)間做value的數(shù)據(jù)結(jié)構(gòu)就行了(雖說(shuō)也可以把備份的文件展開(kāi)比較,但是因?yàn)楣P者才疏學(xué)淺,尚不知如何操作,就只能通過(guò)鍵值對(duì)來(lái)判斷了)
不過(guò)實(shí)際操作起來(lái),再次彰顯了筆者的才疏學(xué)淺,筆者也不知道如何在bash中創(chuàng)建一個(gè)高效并能持久化的鍵值對(duì),如果哪位大佬知道請(qǐng)務(wù)必告訴筆者。
最后筆者想到Mac自帶的SQLite3,雖說(shuō)這樣一個(gè)小小的功能上數(shù)據(jù)庫(kù)是有一點(diǎn)高射炮打蚊子,但是能跑就行吧。腳本如下;
#!/usr/bin/env bash set -euo pipefail ################# variable define ########## now=`date "+%Y%m%d%H%M%S"` red=`tput setaf 1` green=`tput setaf 2` yellow=`tput setaf 3` reset=`tput sgr0` xcode_dir="${HOME}/Library/Developer/Xcode/UserData" cloud_backup_dir="${HOME}/Library/Mobile Documents/com~apple~CloudDocs/XcodeBackup" local_backup_dir="${HOME}/資源/歸檔/XcodeBackup" xcode_backup_database="${HOME}/Library/Mobile Documents/com~apple~CloudDocs/.BackupDatabase" code_snippets="CodeSnippets" font_and_color_themes="FontAndColorThemes" key_bindings="KeyBindings" temp="DoNotModify" database="${xcode_backup_database}/${temp}" ########### MAIN ################## # check directory exist if [ ! -d "${cloud_backup_dir}" ]; then echo "${red}iCloud Drive備份路徑不存在!${reset}" mkdir -p "${cloud_backup_dir}" echo "${green}自動(dòng)創(chuàng)建iCloud Drive備份路徑:${reset}${cloud_backup_dir}" else echo "${green}iCloud Drive備份路徑:${reset}${cloud_backup_dir}" fi if [ ! -d "${local_backup_dir}" ]; then echo "${red}本地備份路徑不存在!${reset}" mkdir -p "${local_backup_dir}" echo "${green}自動(dòng)創(chuàng)建本地備份路徑:${reset}${local_backup_dir}" else echo "${green}本地備份路徑:${reset}${cloud_backup_dir}" fi if [ ! -d "${xcode_backup_database}" ]; then echo "${red}同步數(shù)據(jù)庫(kù)路徑不存在!${reset}" mkdir -p "${xcode_backup_database}" echo "${green}自動(dòng)創(chuàng)建數(shù)據(jù)庫(kù)路徑:${reset}${local_backup_dir}" else echo "${green}數(shù)據(jù)庫(kù)路徑:${reset}${cloud_backup_dir}" fi sqlite3 "${database}" 'create table if not exists backupXcode(id integer primary key not NULL,key integer unique not NULL,value integer not NULL);' #獲取最后修改時(shí)間 cd "${xcode_dir}" find "./${code_snippets}" "./${font_and_color_themes}" "./${key_bindings}" -type f >> ${temp} while read path; do key=`md5 -q -s "${path}"` value=`stat -f "%m" "${path}"` isModify=`sqlite3 "${database}" "select value from backupXcode where key == '${key}';"` if [ -z ${isModify} ]; then echo "${yellow}本地Xcode配置尚未同步${reset}!" num=`ls -l "${cloud_backup_dir}" |grep "^-"|wc -l` if [ ${num} -ge 1 ]; then echo "${green}找到最新的Xcode配置,開(kāi)始自動(dòng)替換${reset}!" cd "${xcode_dir}" ## backup before zip -r "XcodeBackup.zip" "${code_snippets}" "${font_and_color_themes}" "${key_bindings}" & wait cd "${cloud_backup_dir}" newBackup=`ls -t | head -1` unzip -u "${newBackup}" -d "${xcode_dir}" & wait cd "${xcode_dir}" rm ${temp} find "./${code_snippets}" "./${font_and_color_themes}" "./${key_bindings}" -type f >> ${temp} echo 更新數(shù)據(jù)庫(kù)... while read path; do key=`md5 -q -s "${path}"` value=`stat -f "%m" "${path}"` sqlite3 "${database}" "insert or replace into backupXcode values(NULL,'${key}',${value});" & done < ${temp} fi break fi if [ ${isModify} != ${value} ]; then if [ ${isModify} -lt ${value} ]; then echo "${yellow}本地Xcode配置超前${reset}!" else echo "${yellow}本地Xcode配置已經(jīng)過(guò)期${reset}!" num=`ls -l "${cloud_backup_dir}" |grep "^-"|wc -l` if [ ${num} -ge 1 ]; then echo "${green}找到最新的Xcode配置,開(kāi)始自動(dòng)替換${reset}!" cd "${xcode_dir}" ## backup before zip -r "XcodeBackup.zip" "${code_snippets}" "${font_and_color_themes}" "${key_bindings}" & wait cd "${cloud_backup_dir}" newBackup=`ls -t | head -1` unzip -o "${newBackup}" -d "${xcode_dir}" & wait fi fi cd "${xcode_dir}" rm ${temp} find "./${code_snippets}" "./${font_and_color_themes}" "./${key_bindings}" -type f >> ${temp} echo 更新數(shù)據(jù)庫(kù)... while read path; do key=`md5 -q -s "${path}"` value=`stat -f "%m" "${path}"` sqlite3 "${database}" "insert or replace into backupXcode values(NULL,'${key}',${value});" done < ${temp} break fi done < ${temp} wait rm ${temp} # zip files cd "${xcode_dir}" zip -r "${cloud_backup_dir}/XcodeBackup+${now}.zip" "${code_snippets}" "${font_and_color_themes}" "${key_bindings}" & zip -r "${local_backup_dir}/XcodeBackup+${now}.zip" "${code_snippets}" "${font_and_color_themes}" "${key_bindings}" & wait # delete unnecessary backup files num=`ls -l "${cloud_backup_dir}" |grep "^-"|wc -l` if [ ${num} -gt 5 ]; then num=`expr ${num} - 5` cd "${cloud_backup_dir}" ls -tr "${cloud_backup_dir}" | head -${num} | xargs rm fi num=`ls -l "${local_backup_dir}" |grep "^-"|wc -l` if [ ${num} -gt 5 ]; then num=`expr ${num} - 5` cd "${local_backup_dir}" ls -tr "${local_backup_dir}" | head -${num} | xargs rm fi
后記
筆者簡(jiǎn)單測(cè)試了一下,基本上能用。以此思路,應(yīng)該也可用在Alfred、vimrc等配置文件。不過(guò)依舊不是很方便,不過(guò)筆者才疏學(xué)淺,目前也就這個(gè)水平了,希望能對(duì)大家有所幫助,不知道大家有沒(méi)有什么好的建議?筆者認(rèn)為可以在Xcode關(guān)閉時(shí)自動(dòng)運(yùn)行本腳本,但是尚未找到好的胡克點(diǎn)(:」∠)_,如果大家有什么好的建議,歡迎PR
好了,以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
相關(guān)文章
深入分析iOS應(yīng)用中對(duì)于圖片緩存的管理和使用
這篇文章主要介紹了iOS應(yīng)用中對(duì)于圖片緩存的管理和使用,實(shí)例代碼為傳統(tǒng)的Objective-C,需要的朋友可以參考下2016-04-04iOS Tabbar中間添加凸起可旋轉(zhuǎn)按鈕功能
最近的項(xiàng)目中有需求在tabbar中間添加凸起按鈕,并且點(diǎn)擊時(shí)按鈕要旋轉(zhuǎn),看了仿斗魚(yú)的凸起,點(diǎn)擊后是present出來(lái)View,這篇文章主要介紹了iOS Tabbar中間添加凸起可旋轉(zhuǎn)按鈕,需要的朋友可以參考下2017-12-12IOS百度地圖導(dǎo)航開(kāi)發(fā)功能實(shí)現(xiàn)簡(jiǎn)述
百度地圖導(dǎo)航非常實(shí)用,那么基于代碼是如何實(shí)現(xiàn)的呢,下面通過(guò)本文給大家介紹IOS百度地圖導(dǎo)航開(kāi)發(fā)功能實(shí)現(xiàn)簡(jiǎn)述,需要的朋友可以參考下本文2016-03-03