|
在跨 windows 和 macOS 作業系統開發時,當開發同一份程式給兩種作業系統使用,特別在使用 git 進行管理時,framework 在某些頻繁更新或同時發布的時候,很常會碰到 Symbolic Link (Symlink) Error 的問題。 |
---|
Symbolic Link Error
正常的 framework 內的檔案結構應該會類似下面的結果:
可以觀察到資料夾 Headers, Modules, Resources, 還有 Sample 為具備 Symbolic Link 的軟連結資料,在 command line 模式內下 ls -al 會看到類似下面的顯示:
[~/blogger/202303/framework/Sample.framework]$ ls -al total 16 drwxr-xr-x 8 ------ staff 256 3 15 00:30 . drwxr-xr-x 5 ------ staff 160 3 15 00:21 .. lrwxr-xr-x 1 ------ staff 24 3 14 20:11 Headers -> Versions/Current/Headers lrwxr-xr-x 1 ------ staff 24 3 14 20:13 Modules -> Versions/Current/Modules lrwxr-xr-x 1 ------ staff 26 3 14 20:13 Resources -> Versions/Current/Resources lrw-r--r-- 1 ------ staff 22 10 7 11:48 Sample -> Versions/Current/Sample drwxr-xr-x 5 ------ staff 160 3 14 20:11 Versions [~/blogger/202303/framework/Sample.framework]$
然而,當這些檔案被以一班檔案搬移的方式,從 macOS 環境下搬移到 windows 環境,或者在 windows 環境下做了任何的複製、移動,或修改,將造成原本的 Symbolic Link 失效,並且檔案在 macOS 的 Finder 內顯示如下:
或者在 command line 下 ls -al 會顯示類似如下:
[~/blogger/202303/framework_fail/Sample.framework]$ ls -al total 48 drwxr-xr-x@ 8 ------ staff 256 3 15 00:17 . drwxr-xr-x@ 5 ------ staff 160 3 15 00:16 .. -rw-r--r--@ 1 ------ staff 24 3 14 16:15 Headers -rw-r--r--@ 1 ------ staff 24 3 14 16:15 Modules -rw-r--r--@ 1 ------ staff 26 3 14 16:15 Resources -rw-r--r--@ 1 ------ staff 22 3 14 16:15 Sample drwxr-xr-x@ 4 ------ staff 128 3 15 00:15 Versions [~/blogger/202303/framework_fail/Sample.framework]$
可看到 Symbolic Link 的符號消失不見。
修正方法
修正方法為將原始壞掉的檔看砍掉,並且重新建立 Symbolic Link,在 command line 模式根據下面的順序進行操作:
- 刪除損毀的 reference 或 symlink,刪除之前無法建立新的 symlink;
- 透過指令 ln -s 重新建立 symlink;
rm [Fail Symlink]
ln -s [Source] [Symlink]
底下為一個完整個刪除重建範例:
[~/blogger/202303/framework_fail/Sample.framework]$ ls -al total 32 drwxr-xr-x@ 7 ------ staff 224 3 15 02:34 . drwxr-xr-x@ 5 ------ staff 160 3 15 00:16 .. -rw-r--r--@ 1 ------ staff 24 3 14 16:15 Headers -rw-r--r--@ 1 ------ staff 24 3 14 16:15 Modules -rw-r--r--@ 1 ------ staff 26 3 14 16:15 Resources -rw-r--r--@ 1 ------ staff 22 3 14 16:15 Sample drwxr-xr-x@ 4 ------ staff 128 3 15 00:15 Versions [~/blogger/202303/framework_fail/Sample.framework]$ cat Headers Versions/Current/Headers% [~/blogger/202303/framework_fail/Sample.framework]$ rm Headers [~/blogger/202303/framework_fail/Sample.framework]$ ln -s Versions/Current/Headers Headers [~/blogger/202303/framework_fail/Sample.framework]$ ls -al total 24 drwxr-xr-x@ 7 ------ staff 224 3 15 02:35 . drwxr-xr-x@ 5 ------ staff 160 3 15 00:16 .. lrwxr-xr-x 1 ------ staff 24 3 15 02:35 Headers -> Versions/Current/Headers -rw-r--r--@ 1 ------ staff 24 3 14 16:15 Modules -rw-r--r--@ 1 ------ staff 26 3 14 16:15 Resources -rw-r--r--@ 1 ------ staff 22 3 14 16:15 Sample drwxr-xr-x@ 4 ------ staff 128 3 15 00:15 Versions [~/blogger/202303/framework_fail/Sample.framework]$
Symbolic Link 失效的檔案可以先用 cat 看檔案內容,以 Header 為例,Header 的內容是 Versions/Current/Headers,即為要建立參照連結的路徑,接著透過 rm 將 Header 移除,透過 ln -s 重新建立新的 Symbolic Link。透過 ls -al 可以看到 Headers 正確指到目標連結了。
實用
ReplyDelete