Realm編譯提速

原創文章轉載請注明出處

由于Realm跨平臺的特性以及一些相對于SQLite性能上的提升,我在15年就開始嘗試在項目中使用Realm替換SQLite。

到了16年以后,Realm進行了一些升級,通過源碼編譯的時候還會從網絡下載realm-core和realm-sync兩個包,由于眾所周知的GFW影響,這兩個包幾乎無法下載,導致編譯失敗進而影響了整個工程的編譯打包。

接下來的步驟你需要有一個梯子,我們要通過瀏覽器下載這兩個包,讓整個編譯速度快起來,而且保證能完成編譯。

1.配置Carthage去取一下realm-cocoa的源碼,打開build.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
}

大概看一下這兩個函數就是去 https://static.realm.io 下載對應的依賴包,然后拷貝到TMP_DIR目錄,解壓,知道這個過程就簡單了。

2.我們先在download_core()的代碼中打印一下TMP_DIR、CORE_TMP_TAR、CORE_TAR、REALM_CORE_VERSION和REALM_SYNC_VERSION這幾個變量,記住echo的代碼要寫在變量賦值語句后面。然后我們執行一下命令,看看結果。

./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.現在我們已經知道要下載的依賴包版本,從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

打開瀏覽器,爬梯子去下載這兩個包吧。這里有個特殊情況,我通過Chrome瀏覽器下載的壓縮包,在執行tar xf xxx.tar.xz --xz的時候會報錯:

core/librealm-watchos.a: Lzma library error: No progress is possible
tar: Error exit delayed from previous errors.

改成Safari瀏覽器下載的壓縮包就能正常解壓。

4.根據第二步打印的內容,將realm-core-2.1.4.tar.xz文件拷貝到/var/folders/dz/cj9x9hg10t1927wqlgjfdlqm0000gn/T/core_bin目錄中,根據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目錄中,根據build.sh的代碼要求修改文件名為sync-1.0.0-BETA-3.3.tar.xz

現在你可以愉快的進行編譯了,存在依賴包的時候就會直接解壓壓縮包,不會再去從網絡下載。

因為CocoaPods經常出錯,時不時的就會清空緩存文件,導致Realm的庫重新打包,所以我采用Carthage將Realm打包成靜態庫導入工程中,這樣其他同事就不需要再做上述重復性的工作了,記得備份那兩個依賴庫哦,也許哪天還需要重新編譯靜態庫呢。

在React Native中使用Realm也一樣,只是打包腳本是在node_modules中。Android我沒有集成過,想來應該也是一樣需要依賴包,依樣畫葫蘆去解決吧。

我是咕咕雞,一個還在不停學習的全棧工程師。
熱愛生活,喜歡跑步,家庭是我不斷向前進步的動力。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 前言 由于最近項目中在用Realm,所以把自己實踐過程中的一些心得總結分享一下。 Realm是由Y Combina...
    一縷殤流化隱半邊冰霜閱讀 73,578評論 213 517
  • 跨平臺:現在很多應用都是要兼顧iOS和Android兩個平臺同時開發。如果兩個平臺都能使用相同的數據庫,那就不用考...
    CoderZS閱讀 2,558評論 2 16
  • 1、pod 警告[!] The LiveChat_Techer [Release] target overrid...
    海底冰hz閱讀 764評論 0 0
  • linux資料總章2.1 1.0寫的不好抱歉 但是2.0已經改了很多 但是錯誤還是無法避免 以后資料會慢慢更新 大...
    數據革命閱讀 12,239評論 2 33
  • 這篇直接搬了一份官方文檔過來看的 由于之前沒用markdown搞的亂七八糟的 所以重新做了一份 后面看到官網...
    石丘閱讀 18,060評論 14 24