Mac OS X打包Redis Desktop Manager(RDM)

 

前言

编译好Redis Desktop Manager 之后,本机电脑是可以跑的,但是其他电脑就不一定能跑了,因为有些依赖在其他电脑上不一定有,或者路径不一样,这时,我们就需要把依赖打入到app中.

第一步,编译Redis Desktop Manager

编译好Redis Desktop Manager ,这个是大前提,如果不知道怎么编译的同学可以参考我的另一篇文章 Mac OS X下编译Redis Desktop Manager(RDM).

第二步,分析目录结构

编译好的app,其实在mac上面是个以.app结尾的目录.其结构如下,(为了减少篇幅,省略了一些目录)

/*
rdm.app
└── Contents
    ├── Frameworks #依赖
    │   └── Breakpad.framework
    │       ├── Breakpad -> Versions/Current/Breakpad
    │       ├── Breakpad.framework -> /Users/doge/project/rdm/bin/Frameworks/Breakpad.framework
    │       ├── Headers -> Versions/Current/Headers
    │       ├── Resources -> Versions/Current/Resources
    │       └── Versions
    │           └── Current -> A
    ├── Info.plist 
    ├── MacOS
    │   ├── logs # 日志
    │   │   └── myeasylog.log
    │   └── rdm #核心文件,是一个可执行文件
    ├── PkgInfo
    └── Resources # 资源
        ├── empty.lproj
        └── rdm.icns
*/

编译好后,这个app在本机运行是没问题的,但是要移植到其他机器去,就需要把依赖copy进来,但是单纯copy是行不通,还是需要遵循点规则.

第三步,依赖分析

通过前面第二步的目录分析,可以知道rdm.app 这个目录里面核心文件是rdm 这个二进制文件.在mac上可以使用otool 这个命令otool -L rdm.app/Contents/MacOS/rdm进行依赖分析.rdm依赖如下(精简了一下,免得太多了):

/*
rdm.app/Contents/MacOS/rdm:
	/usr/lib/libz.1.dylib (compatibility version 1.0.0, current version 1.2.11)
	/usr/local/opt/openssl/lib/libssl.1.0.0.dylib (compatibility version 1.0.0, current version 1.0.0)
	/usr/local/opt/openssl/lib/libcrypto.1.0.0.dylib (compatibility version 1.0.0, current version 1.0.0)
	@executable_path/../Frameworks/Breakpad.framework/Versions/A/Breakpad (compatibility version 1.0.0, current version 1.0.0)
	/usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 400.9.0)
	/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1252.50.4)

*/

可以看到rdm依赖了openssl这个第三方库:

/*
/usr/local/opt/openssl/lib/libssl.1.0.0.dylib (compatibility version 1.0.0, current version 1.0.0)
	/usr/local/opt/openssl/lib/libcrypto.1.0.0.dylib (compatibility version 1.0.0, current version 1.0.0)
*/

需要把这两个dylib文件放入到rdm.app目录中.可以在rdm.app中建立一个lib文件夹,然后在把依赖的这两个文件copy到lib文件夹中.

但这样copy是不起作用的,rdm还是会去/usr/local/opt/openssl/lib这个目录中去找依赖,所以需要把这个目录给改掉.改路径就需要使用工具install_name_tool.

这里说一下@executable_path指的是二进制文件的目录,也就是说在rdm.app中@executable_path等于rdm.app/Contents/MacOS这个路径.借助@executable_path把路径改到之前建立的目录lib上,命令如下:

install_name_tool -change "/usr/local/opt/openssl/lib/libssl.1.0.0.dylib" "@executable_path/../lib/libssl.1.0.0.dylib" rdm.app/Contents/MacOS/rdm

用这个命令,分别把libssl.1.0.0.dylib,libcrypto.1.0.0.dylib的目录给改掉.

ok,到这里已经完成一大半,还有一个地方需要注意,如果libssl.1.0.0.dylib,libcrypto.1.0.0.dylib这两个文件又分别依赖其他文件,还需要手动改一下(好麻烦呀,不知道有没有什么便捷的方法).不幸的是libssl.1.0.0.dylib这个文件依赖libcrypto.1.0.0.dylib,所以还需要按照上面的步骤,在改一下.

第三步,打包

qt提供了macdeployqt这个打包工具,打包还是很方便的,命令如下:

sudo ~/Qt5.9.6/5.9.6/clang_64/bin/macdeployqt rdm.app -qmldir=/Users/doge/project/rdm/src/qml -dmg

该命令执行后会往ram.app目录中加入qt相关的依赖等.最后会生成一个dmg文件.ok,到此打包就完成了.

总结

对于一个没怎么接触过QT的人,打包还是挺蛋疼的(疼死我了).打包后最好本地测试一下,看看能不能跑,如果不能跑,就手动执行一下二进制文件,看看报的什么错,然后找google,相信你遇到的问题都会迎刃而解!