mac下的應用程序發布 及 打包(Python寫的腳本,可打包第三方庫)


其實這個問題在網上能搜到大把的解決方案。大家的統一答案都是

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM