普通的安装过程无非是复制文件和适当配置,无他。下面直奔主题:
WPS_For_Mac_Alpha_1.2.3(321).pkg 是以分发包的格式封装的,利用 macOS 自带的安装器(Installer)进行安装。除了 Installer 提供的基本步骤外,没有使用其它复杂技术进行特殊的定制。 主要需要说明的是下面两个部分:
<bundle CFBundleShortVersionString="1.2.3" CFBundleVersion="321" id="cn.wps.presentation" path="wpp.app"/>
<bundle CFBundleShortVersionString="1.2.3" CFBundleVersion="321" id="cn.wps.spreadsheets" path="et.app"/>
<bundle CFBundleShortVersionString="1.2.3" CFBundleVersion="321" id="cn.wps.writer" path="wps.app"/>
<choice id="cn.wps.writer" visible="false">
<pkg-ref id="cn.wps.writer">
<must-close>
<app id="cn.wps.writer"/>
<app id="cn.wps.presentation"/>
<app id="cn.wps.spreadsheets"/>
</must-close>
</pkg-ref>
</choice>
真正的程序文件都在组件包(wpsoffice.pkg)中,负载很简单只有三个程序:et.app, wpp.app 和 wps.app 装前脚本很简单,就是杀掉了 wpscloudsvr 进程。而最关键的要说是装后脚本了,这个也是重点,几乎所有的 pkg 包都会在装后脚本中做文章,WPS 也不例外。
这里只挑关键的行分析。
第四行:定义了全局的 kingsoft_path="$target_volume/Library/Application Support/Kingsoft"
目前可以猜测,它要在你的机器的"/Library/Application Support"
目录中使用一个 Kingsoft
的子目录 /文件。
接下来他定义了一个 focus_remove_folder()
函数,从名字就知道它干什么用的。
第二个函数:decompress_office6()
:它利用 wps.app 中自带的一个 7za 命令来将储存在 wps.app 中 Frameworks 中的 office6.7z 压缩文件解压到该 Frameworks 中,然后删除了 7za 和 office6.7z. 这个看上去没有任何问题。
第三个函数:redirect_app_office6()
:传入参数 app 的绝对路径。将传入的 app 中的多个软连接: Frameworks/office6,Resources/office6,PlugIns
,的软连接重新定义到前面定义的全局 "$kingsoft_path"
中的 office6。
并使用循环遍历该 app 中 SharedSupport 目录中的所有的 app,递归调用 redirect_app_office6()
函数。
第四个函数:redirect_office6()
:就是将 et.app, wpp.app 和 wps.app 作为参数一次调用 redirect_app_office6()函数
接下来就是脚本的主体部分, 解压 office6, 创建 "$kingsoft_path" 目录,并将 wps.app 中的 office6 和 Plugins 目录移动到 "$kingsoft_path" 目录中。再讲 office6 重新连接到 Plugins 中。
后来是一个循环:
for lang in `ls "Library/Application Support/Kingsoft/WPS Cloud Files/userdata"`
do
for filename in `ls "Library/Application Support/Kingsoft/WPS Cloud Files/userdata/${lang}"`
do
if [ ${filename} != "config.ini" ]; then
focus_remove_folder "Library/Application Support/Kingsoft/WPS Cloud Files/userdata/${lang}/${filename}"
fi
done
done
这里有一个 bug(两处),不太严重。大家可以看出,这个路径错了,在装后脚本目录中怎么会有 "Library/Application Support/Kingsoft..."
目录呢,即使有,对它操作也没用,毕竟安装完了 Installer 负责删除安装所有临时数据。看他的意思应该是安装目标卷的 Library 目录,所以应该加上 ”$target_volume/“
。 这是个小失误,是个没用功,美中不足。
脚本的最后它还创建了一个 "Library/Application Support/wps_newly_install"
文件,内容也是 wps_newly_install。应该是每个 app 初次运行时会寻找这个文件,并做初始化。
至此完全解读了它的安装过程。其实它的主要的过程和目的就是为了节省安装包和 app 的空间,将共享程序和数据都存放在了系统的 "/Library/Application Support/Kingsoft ” 目录中,这个就如同网上流行的给 M$ Office for Mac 瘦身的思路是一样的。
不过,就现在的网络速度和存储,没有必要这样做,直接放在每个 app 中就好,做成 DMG 格式的拖拽分发也是不错的选择,可以打消好多人的疑虑不是。至于如何分辨是否第一次运行,有很多其它方法不是。
还可以看出,它的第一个发布版本很可能不会使用沙盒技术。从诸多方面来看,它离上线 App Store 还有一段路要走,也说不定他们不想上吧。
从上面的分析可以看出,如果只是安装还没有运行,那么完全删除它很简单, 就一行命令:
rm -fr /Applications/et.app /Applications/wpp.app /Applications/wps.app "/Library/Application Support/Kingsoft"
如果有洁癖的最多加一句:
pkgutil --forget "cn.wps.writer"
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.