原創(chuàng)文章轉(zhuǎn)載請(qǐng)注明出處
由于Realm跨平臺(tái)的特性以及一些相對(duì)于SQLite性能上的提升,我在15年就開始嘗試在項(xiàng)目中使用Realm替換SQLite。
到了16年以后,Realm進(jìn)行了一些升級(jí),通過源碼編譯的時(shí)候還會(huì)從網(wǎng)絡(luò)下載realm-core和realm-sync兩個(gè)包,由于眾所周知的GFW影響,這兩個(gè)包幾乎無法下載,導(dǎo)致編譯失敗進(jìn)而影響了整個(gè)工程的編譯打包。
接下來的步驟你需要有一個(gè)梯子,我們要通過瀏覽器下載這兩個(gè)包,讓整個(gè)編譯速度快起來,而且保證能完成編譯。
1.配置Carthage去取一下realm-cocoa的源碼,打開build.sh文件找到以下兩個(gè)函數(shù)。
download_core() {
echo "Downloading dependency: core ${REALM_CORE_VERSION}"
TMP_DIR="$TMPDIR/core_bin"
mkdir -p "${TMP_DIR}"
CORE_TMP_TAR="${TMP_DIR}/core-${REALM_CORE_VERSION}.tar.xz.tmp"
CORE_TAR="${TMP_DIR}/core-${REALM_CORE_VERSION}.tar.xz"
if [ ! -f "${CORE_TAR}" ]; then
local CORE_URL="https://static.realm.io/downloads/core/realm-core-${REALM_CORE_VERSION}.tar.xz"
set +e # temporarily disable immediate exit
local ERROR # sweeps the exit code unless declared separately
ERROR=$(curl --fail --silent --show-error --location "$CORE_URL" --output "${CORE_TMP_TAR}" 2>&1 >/dev/null)
if [[ $? -ne 0 ]]; then
echo "Downloading core failed:\n${ERROR}"
exit 1
fi
set -e # re-enable flag
mv "${CORE_TMP_TAR}" "${CORE_TAR}"
fi
(
cd "${TMP_DIR}"
rm -rf core
tar xf "${CORE_TAR}" --xz
mv core core-${REALM_CORE_VERSION}
)
rm -rf core-${REALM_CORE_VERSION} core
mv ${TMP_DIR}/core-${REALM_CORE_VERSION} .
ln -s core-${REALM_CORE_VERSION} core
}
download_sync() {
echo "Downloading dependency: sync ${REALM_SYNC_VERSION}"
TMP_DIR="$TMPDIR/sync_bin"
echo ${TMP_DIR}
mkdir -p "${TMP_DIR}"
SYNC_TMP_TAR="${TMP_DIR}/sync-${REALM_SYNC_VERSION}.tar.xz.tmp"
echo ${SYNC_TMP_TAR}
SYNC_TAR="${TMP_DIR}/sync-${REALM_SYNC_VERSION}.tar.xz"
echo ${SYNC_TAR}
if [ ! -f "${SYNC_TAR}" ]; then
local SYNC_URL="https://static.realm.io/downloads/sync/realm-sync-cocoa-${REALM_SYNC_VERSION}.tar.xz"
set +e # temporarily disable immediate exit
local ERROR # sweeps the exit code unless declared separately
ERROR=$(curl --fail --silent --show-error --location "$SYNC_URL" --output "${SYNC_TMP_TAR}" 2>&1 >/dev/null)
if [[ $? -ne 0 ]]; then
echo "Downloading sync failed:\n${ERROR}"
exit 1
fi
set -e # re-enable flag
mv "${SYNC_TMP_TAR}" "${SYNC_TAR}"
fi
(
cd "${TMP_DIR}"
rm -rf sync
tar xf "${SYNC_TAR}" --xz
mv core sync-${REALM_SYNC_VERSION}
)
rm -rf sync-${REALM_SYNC_VERSION} core
mv ${TMP_DIR}/sync-${REALM_SYNC_VERSION} .
ln -s sync-${REALM_SYNC_VERSION} core
}
大概看一下這兩個(gè)函數(shù)就是去 https://static.realm.io 下載對(duì)應(yīng)的依賴包,然后拷貝到TMP_DIR目錄,解壓,知道這個(gè)過程就簡單了。
2.我們先在download_core()的代碼中打印一下TMP_DIR、CORE_TMP_TAR、CORE_TAR、REALM_CORE_VERSION和REALM_SYNC_VERSION這幾個(gè)變量,記住echo的代碼要寫在變量賦值語句后面。然后我們執(zhí)行一下命令,看看結(jié)果。
./build.sh download-core
比如我這里打印出來的是
Downloading dependency: core 2.1.4
1.0.0-BETA-3.3
/var/folders/dz/cj9x9hg10t1927wqlgjfdlqm0000gn/T//core_bin
/var/folders/dz/cj9x9hg10t1927wqlgjfdlqm0000gn/T//core_bin/core-2.1.4.tar.xz.tmp
/var/folders/dz/cj9x9hg10t1927wqlgjfdlqm0000gn/T//core_bin/core-2.1.4.tar.xz
3.現(xiàn)在我們已經(jīng)知道要下載的依賴包版本,從build.sh里面可以知道具體的下載鏈接分別是:
https://static.realm.io/downloads/core/realm-core-2.1.4.tar.xz
https://static.realm.io/downloads/sync/realm-sync-cocoa-1.0.0-BETA-3.3.tar.xz
打開瀏覽器,爬梯子去下載這兩個(gè)包吧。這里有個(gè)特殊情況,我通過Chrome瀏覽器下載的壓縮包,在執(zhí)行tar xf xxx.tar.xz --xz的時(shí)候會(huì)報(bào)錯(cuò):
core/librealm-watchos.a: Lzma library error: No progress is possible
tar: Error exit delayed from previous errors.
改成Safari瀏覽器下載的壓縮包就能正常解壓。
4.根據(jù)第二步打印的內(nèi)容,將realm-core-2.1.4.tar.xz文件拷貝到/var/folders/dz/cj9x9hg10t1927wqlgjfdlqm0000gn/T/core_bin目錄中,根據(jù)build.sh的代碼要求修改文件名為core-2.1.4.tar.xz,將realm-sync-cocoa-1.0.0-BETA-3.3.tar.xz文件拷貝到/var/folders/dz/cj9x9hg10t1927wqlgjfdlqm0000gn/T/sync_bin目錄中,根據(jù)build.sh的代碼要求修改文件名為sync-1.0.0-BETA-3.3.tar.xz。
現(xiàn)在你可以愉快的進(jìn)行編譯了,存在依賴包的時(shí)候就會(huì)直接解壓壓縮包,不會(huì)再去從網(wǎng)絡(luò)下載。
因?yàn)镃ocoaPods經(jīng)常出錯(cuò),時(shí)不時(shí)的就會(huì)清空緩存文件,導(dǎo)致Realm的庫重新打包,所以我采用Carthage將Realm打包成靜態(tài)庫導(dǎo)入工程中,這樣其他同事就不需要再做上述重復(fù)性的工作了,記得備份那兩個(gè)依賴庫哦,也許哪天還需要重新編譯靜態(tài)庫呢。
在React Native中使用Realm也一樣,只是打包腳本是在node_modules中。Android我沒有集成過,想來應(yīng)該也是一樣需要依賴包,依樣畫葫蘆去解決吧。
我是咕咕雞,一個(gè)還在不停學(xué)習(xí)的全棧工程師。
熱愛生活,喜歡跑步,家庭是我不斷向前進(jìn)步的動(dòng)力。