码迷,mamicode.com
首页 > 编程语言 > 详细

mac下的应用程序发布 及 打包(Python写的脚本,可打包第三方库)

时间:2016-05-28 00:53:13      阅读:480      评论:0      收藏:0      [点我收藏+]

标签:

其实这个问题在网上能搜到大把的解决方案。大家的统一答案都是

otool -L yourapp.app/Contents/MacOS/yourapp

根据输出信息在运行 install_name_tool

install_name_tool的使用方法在这里

比较复杂的是当依赖了很多第三方库,尤其是向QT这样的库的时候。打包那叫一个麻烦啊。

QT有个官方的文档告诉你如何手动一步步打包程序,还提供了一个macdepotqt这么个程序。帮你进行打包。

可是啊,macdepotqt不支持其他第三方库,也不灵活,按照官方文档的方式手动打包,坑爹啊。

说他坑爹一点都不假,当你遇到了成片的符号需要你敲命令的话,想死的心情油然而生。

那么好了。自己动手吧。这里我给出一个我写的打包的Python脚本半成品,思想跟手动敲命令是一样的,只不过用脚本实现自动化了同时递归检查并将缺少的库考到bundle目录中。脚本中针对QT的库进行打包了,如果希望把其他的依赖库也打包的话在keywordList里边添加相应的关键字就好了。希望对大家能有帮助。

 

 

[python] view plain copy
 
  1. import os  
  2. import sys  
  3. import commands  
  4. binaryName = "yourapp"  
  5. bundleName = "yourapp.app"  
  6. bundleFrameworkDir = "Contents/Frameworks/"  
  7. bundleBinaryDir = "Contents/MacOS/"  
  8. bundleLibraryList = [];  
  9. systemFrameworkDir = "/Library/Frameworks/"  
  10. keyWordList = ["Qt"]  
  11. #add more keywords to work better  
  12.   
  13. def hasKeyWord(word):  
  14.     for it in keyWordList:  
  15.         if word.find(it) != -1:  
  16.             return True  
  17.     return False  
  18.   
  19.   
  20. def findApp(name):  
  21.     return name+bundleBinaryDir+binaryName  
  22.   
  23.   
  24. def getBundleDependsInfo(app):  
  25.     dependList = commands.getoutput("otool -L " + app).replace("\t","").split("\n");  
  26.     del(dependList[0])  
  27.     dependList = [item.split(" ")[0] for item in dependList if hasKeyWord(item)];  
  28.     return dependList  
  29.   
  30.   
  31.       
  32. def copyLibrary(base, src, dst):  
  33.     systemFullPath = src  
  34.     print "library %s depend %s" % (os.path.basename(base), os.path.basename(dst))  
  35.     if not os.path.exists(dst):  
  36.         bundleFullPath = os.path.dirname(dst)  
  37.         os.system("mkdir -p %s" % (bundleFullPath))  
  38.         os.system("cp %s %s" % (systemFullPath, bundleFullPath))  
  39.         infoList = getBundleDependsInfo(dst)  
  40.         copyDependFiles(dst, infoList)  
  41.         os.system("install_name_tool -id @executable_path/../Frameworks/%s %s" % (src, dst))  
  42.     os.system("install_name_tool -change %s @executable_path/../Frameworks/%s %s" % (src, src, base))  
  43.   
  44.   
  45. def getFrameworkName(dirname):  
  46.     if dirname.find("framework") == -1:  
  47.         return  
  48.     while not dirname.endswith("framework"):  
  49.         dirname = os.path.dirname(dirname)  
  50.     return dirname  
  51.   
  52.   
  53. def copyFrameworkExtDir(src):  
  54.     sysPath = systemFrameworkDir + src  
  55.     destPath = ""  
  56.     if not os.path.exists(sysPath):  
  57.         return  
  58.     frameworkPath = getFrameworkName(sysPath)  
  59.     frameWorkName = getFrameworkName(src)  
  60.     bundlePath = bundleName + "/" + bundleFrameworkDir + frameWorkName + "/"  
  61.     for it in bundleFrameworkExtDir:  
  62.         destPath = bundlePath + it  
  63.         srcPath = frameworkPath + "/" + it  
  64.         if not os.path.exists(destPath) and os.path.exists(srcPath):  
  65.             print "copying %s %s" % (frameWorkName, it)  
  66.             os.system("cp -r %s %s" % (srcPath, destPath))    
  67.   
  68.   
  69. def copyFramework(base, src, dst):  
  70.     print "framework %s depend %s" % (os.path.basename(base), os.path.basename(dst))  
  71.     systemFullPath = systemFrameworkDir+src  
  72.     if not os.path.exists(dst):  
  73.         bundleFullPath = os.path.dirname(dst)  
  74.         os.system("mkdir -p %s" % (bundleFullPath))  
  75.         os.system("cp %s %s" % (systemFullPath, bundleFullPath))  
  76.         copyFrameworkExtDir(src)  
  77.         infoList = getBundleDependsInfo(dst)  
  78.         copyDependFiles(dst, infoList)  
  79.         ("install_name_tool -id @executable_path/../Frameworks/%s %s" % (src, dst))  
  80.         os.system("install_name_tool -id @executable_path/../Frameworks/%s %s" % (src, dst))  
  81.     os.system("install_name_tool -change %s @executable_path/../Frameworks/%s %s" % (src, src, base))  
  82.   
  83.   
  84.   
  85.   
  86. def copyDependFiles(base, infoList):  
  87.     targetDir = ""  
  88.     for it in infoList:  
  89.         targetDir = bundleName + "/" + bundleFrameworkDir + it  
  90.         if it.find("framework") != -1:  
  91.             copyFramework(base, it, targetDir)  
  92.         else:  
  93.             copyLibrary(base, it, targetDir)  
  94.   
  95.   
  96.   
  97.   
  98.       
  99. def makeBundleDirs():  
  100.     os.system("mkdir -p " + bundleName + "/" + bundleFrameworkDir)  
  101.   
  102.   
  103. if __name__ == "__main__":  
  104.     target = findApp(bundleName + "/")  
  105.     makeBundleDirs()  
  106.     infoList = getBundleDependsInfo(target)  
  107.     copyDependFiles(target, infoList)  

http://blog.csdn.net/livemylife/article/details/7294778

mac下的应用程序发布 及 打包(Python写的脚本,可打包第三方库)

标签:

原文地址:http://www.cnblogs.com/findumars/p/5536460.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!