• Mac 自动化打包脚本


    总目录:Mac + Apache + PHP+打包脚本 = Mac自动化打包

    作为ios开发员,打包是家常便饭啦.....

    所以,把复杂的流程简单化,有助于减轻自己的工作量,还能有效的防止问题发生...最重要的,没那么快秃顶!

    打包共几个步骤

    1.编译unity生成xcode工程

    2.导入生成的文件到打包工程

    3.更改打包工程配置,如版本号

    4.编译

    5.签名生成包

    我们一步一步来

    1.编译unity生成Xcode工程

    unity里面提供的方法进行打包,只用在脚本里调用unity的类方法就能执行unity里写的打包类

     1 #compileunity工程,导出iOS工程!
     2 defexportIosProject(logfilePath):
     3 print "\n--------------------------------------------------------------- compile unity project....... --------------------------------------------------------------\n"
     4 command ="/Applications/Unity2017.2.3f1/Unity.app/Contents/MacOS/Unity -quit -batchmode -projectPath /Users/admin/projectName -executeMethod ProjectBuilderIOS.BuildForIosProjectIl2Cpp >>%s"%(logfilePath)
     5 printcommand
     6 unityCompile_statue = os.system(command)
     7 unityCompile_statue>>=8
     8 ifunityCompile_statue==0:
     9 print "\n***************************************************************** compile unity project succeed ********************************************************\n"
    10 else:
    11 print "\n!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! compile unity project fail !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n"
    12 exit(0)

    2.导入生成的文件到打包工程
    找到项目的路径,更改.pbxproj文件

    ####################################################################################################################################################
    #新加的编辑xcodeproj工程文件的代码
    pbxproj_dir = '%s/%s/project.pbxproj'%(pro_dir,fileName)
    pro_dir_arr = pro_dir.split('/')
    arr_len = len(pro_dir_arr)
    pro_dir_arr[arr_len-1] = 'Classes/Native/'
    Native_dir = '/'.join(pro_dir_arr)
    Native_files = file_name(Native_dir)
    for file in Native_files:
    data = ''
    uuid_f = ''.join(str(uuid.uuid4()).upper().split('-')[1:])
    uuid_r = ''.join(str(uuid.uuid4()).upper().split('-')[1:])
    if (isincludestr(pbxproj_dir, file)):
    continue
    while(isincludestr(pbxproj_dir, uuid_f)):
    uuid_f =''.join(str(uuid.uuid4()).upper().split('-')[1:])
    while(isincludestr(pbxproj_dir, uuid_r)):
    uuid_r =''.join(str(uuid.uuid4()).upper().split('-')[1:])
    buildfilesection_str = creat_buildfilesection(file, uuid_f, uuid_r)
    refsection_str = creat_refsection(file, uuid_r)
    PBXBuildFile_line = getstrlineinfile(pbxproj_dir, '/* Begin PBXBuildFile section */')
    insertline(pbxproj_dir, PBXBuildFile_line ,buildfilesection_str)
    PBXFileReference_line = getstrlineinfile(pbxproj_dir, '/* Begin PBXFileReference section */')
    insertline(pbxproj_dir, PBXFileReference_line ,refsection_str)
    folder_line = getstrlineinfile(pbxproj_dir, '/* Native */ = {')+2
    insertline(pbxproj_dir, folder_line ,('%s /* %s */,' %(uuid_r,file)))
    PBXSourcesBuildPhase_line = getstrlineinfile(pbxproj_dir, '/* Begin PBXSourcesBuildPhase section */')+4
    insertline(pbxproj_dir, PBXSourcesBuildPhase_line ,('%s /* %s in Sources */,' %(uuid_f,file)))
    ###################################################################################################################################################


    3.更改打包工程配置,如版本号
    获取对应项目的info.plist文件进行更改版本号

    #获取项目的info配置文件
    try:
    if os.path.exists(pro_dir+"/Info.plist"):
    plist=readPlist(pro_dir+"/Info.plist");
    else:
    #这里需要注意工程目录下是否有该目录
    plist=readPlist(pro_dir+"/"+target+"/Info.plist");
    except InvalidPlistException,e:
    print "not a plist or plist invalid:",e
    
    #修改项目的info配置文件(修改了项目的游戏版本和compile版本号)
    try:
    plist['CFBundleVersion']=game_version
    plist['CFBundleShortVersionString']=build_version
    if os.path.exists(pro_dir+"/Info.plist"):
    writePlist(plist,pro_dir+"/Info.plist")
    else:
    writePlist(plist,pro_dir+"/"+target+"/Info.plist")
    
    except (InvalidPlistException, NotBinaryPlistException), e:
    print "Something bad happened:", e

    4.编译
    在编译之前需要先清理下xcode工程

    def clean(dir,pro_name,logfilePath):
    print "\n--------------------------------------------------------------- ios begin clean....... --------------------------------------------------------------- \n"
    command = "cd %s; xcodebuild -target %s clean >>%s"% (dir,pro_name,logfilePath)
    print command
    os.system(command)
    iosBuild_status = os.system(command)
    iosBuild_status>>=8
    if iosBuild_status==0 :
    print "\n***************************************************************** ios clean succeed ********************************************************\n"
    else:
    print "\n!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ios clean fail!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n"


    编译分为两种:
    第一种build,这种打出来的包里面会有调试信息,包体会增大,建议测试包使用,

    def build(dir,pro_name,build_config,code_sign,logfilePath):
    print "\n--------------------------------------------------------------- ios compile begin --------------------------------------------------------------- \n"
    command = "cd %s;xcodebuild -target %s -sdk iphoneos -configuration %s CODE_SIGN_IDENTITY='%s' >> %s" % (dir,pro_name,build_config,code_sign,logfilePath)
    print command
    iosBuild_status = os.system(command)
    iosBuild_status>>=8
    if iosBuild_status==0 :
    print "\n***************************************************************** ios compile succeed ********************************************************\n"
    else:
    print "\n!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ios compile fail !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n"
    exit(0)


    第二种是Archive,这种是比较好的打包方式,没有调试信息,发布包建议用这种方式

    def buildForArchive(dir,pro_name,logfilePath):
    print "\n--------------------------------------------------------------- ios compile begin --------------------------------------------------------------- \n"
    ipa_out_put_archive = "%s/build/%s.xcarchive" % (dir,pro_name)
    command = "cd %s;xcodebuild archive -project %s.xcodeproj -scheme %s -archivePath %s >> %s" % (dir,pro_name,pro_name,ipa_out_put_archive,logfilePath)
    print command
    iosBuild_status = os.system(command)
    iosBuild_status>>=8
    if iosBuild_status==0 :
    print "\n***************************************************************** ios compile succeed ********************************************************\n"
    else:
    print "\n!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ios compile fail !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n"
    exit(0)


    5.签名生成包
    和编译对应的,生成包的方式也有两种,
    第一种build,对build出来的app签名生成ipa

    def export(current_time,current_section,dir,build_config,pro_name,version,code_sign,code_profile,save_dir,logfilePath):
    #设置ipa包的包名和存储位置
    ipa_out_put_name = "%s-%s-%s-%s-%s"%(current_time,version,pro_name,current_section,build_config)
    ipa_out_put = os.path.join(sys.path[0],"pack/%s.ipa"%(ipa_out_put_name))
    if not os.path.exists(os.path.join(sys.path[0],"pack")):
    os.makedirs(os.path.join(sys.path[0],"pack"))
    print "pack 文件夹不存在 新建一个"
    _appPath = "%s/build/%s" % (dir,build_config)
    _appName = getFileFromDir(_appPath,"app")
    print "\n--------------------------------------------------------------- ios pack begin --------------------------------------------------------------- \n"
    command = "cd %s;xcrun -sdk iphoneos PackageApplication -v %s/build/%s/%s.app -o '%s' —sign '%s' —embed %s >> %s" % (dir,dir,build_config,_appName,ipa_out_put,code_sign,code_profile,logfilePath)
    print command
    os.system(command)
    iosBuild_status = os.system(command)
    iosBuild_status>>=8
    if iosBuild_status==0 :
    print "\n***************************************************************** ios pack succeed ********************************************************\n"
    else:
    print "\n!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ios pack fail !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n"
    exit(0)
    ```
    第二种Archive,对Archive出来的.xcarchive文件签名生成ipa
    ```
    def exportForArchive(current_time,current_section,dir,build_config,pro_name,version,save_dir,logfilePath):
    #设置ipa包的包名和存储位置
    ipa_out_put_name = "%s-%s-%s-%s-%s"%(current_time,version,pro_name,current_section,build_config)
    ipa_out_put = os.path.join(sys.path[0],"pack/%s"%(ipa_out_put_name))
    if not os.path.exists(os.path.join(sys.path[0],"pack")):
    os.makedirs(os.path.join(sys.path[0],"pack"))
    print "pack 文件夹不存在 新建一个"
    
    #获取项目的打包配置文件
    pakegePlistPath = "%s/release.plist" % (dir)
    #开始打包
    print "\n--------------------------------------------------------------- ios pack begin--------------------------------------------------------------- \n"
    command = "cd %s;xcodebuild -exportArchive -archivePath %s/build/%s.xcarchive -exportPath %s -exportOptionsPlist %s >> %s" % (dir,dir,pro_name,ipa_out_put,pakegePlistPath,logfilePath)
    print command
    iosBuild_status = os.system(command)
    iosBuild_status>>=8
    if iosBuild_status==0 :
    print "\n***************************************************************** ios pack succeed ********************************************************\n"
    else:
    print "\n!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ios pack fail !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n"
    exit(0)
    #将生成的IPA重命名
    copyfile(ipa_out_put+"/"+pro_name+".ipa",ipa_out_put+".ipa")
    deletetree(ipa_out_put);

     以上最主要的几步都已列出,按照自己的需要使用

    下面贴上我使用的脚本,其中有些数据如"os.environ["BASKETBALL_PRO_DIR"]"这种,是在系统设置的环境变量,是路径字符串
    顺带贴上设置环境变量的方法

    IOS : 环境变量 BASKETBALL_PRO_DIR (项目根目录)如 : /444/111/www
    配置指引:在终端 输入命令 vim .bash_profile, vim打开 bash_profile 
    按键盘 ‘i’键进入编辑模式
    在编辑模式下,配置项目跟目录 export BASKETBALL_PRO_DIR=“pro_dir” 如:export BASKETBALL_PRO_DIR= /444/111/www
    确认路径正确之后,按esc 进入vim 的命令模式输入 ":wq" 保存文件并退出vim
    输入命令 source .bash_profile 立即生效环境变量
    验证环境变量:在终端 输入 echo $BASKETBALL_PRO_DIR 环境变量设置正确的情况下 终端将会输出您所设置的篮球项目根目录
    在终端 输入 echo $BASKETBALL_GAMERENDER_DIR 环境变量设置正确的情况下 终端将会输出您所设置的gamerender 的根目录路径

    点个赞再走呗。。。

    如有疑问,联系作者

    博客园:这个我不知道诶


     
     
  • 相关阅读:
    C++ 类的多态一(virtual关键字--构造函数深刻理解)
    C++ 类的继承六(多继承的二义性--虚基类)
    C++ 类的继承五(类继承中的static关键字)
    C++ 类的继承四(类继承中的重名成员)
    C++ 类的继承三(继承中的构造与析构)
    C++ 类的继承二(赋值兼容性原则)
    C++ 类的继承一(访问控制)
    C++ 匿名对象产生场景
    WPF/ASP.NET:几个Prism中的术语
    Prism 5 + MEF中的ModuleCatalog.CreateFromXaml问题
  • 原文地址:https://www.cnblogs.com/Yongersblog/p/12454282.html
Copyright © 2020-2023  润新知