(window.webpackJsonp=window.webpackJsonp||[]).push([[118],{594:function(s,t,e){"use strict";e.r(t);var a=e(14),r=Object(a.a)({},(function(){var s=this,t=s._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":s.$parent.slotKey}},[t("p",[s._v("使用 "),t("code",[s._v("Xcode")]),s._v(" 手动打包是正常的，但是使用脚本打包会报错，错误如下：")]),s._v(" "),t("div",{staticClass:"language-shell extra-class"},[t("pre",{pre:!0,attrs:{class:"language-shell"}},[t("code",[s._v("The following build commands failed:\n\tPhaseScriptExecution "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("CP-User"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("\\")]),s._v(" Run"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("\\")]),s._v(" Flutter"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("\\")]),s._v(" Build"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("\\")]),s._v(" Script "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("..")]),s._v("./Script-C3A097A8FE12FF5F875B057C.sh\n\t\nflutter build ios "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[s._v("--release")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("then")]),s._v(" re-run Archive from Xcode.\nCommand PhaseScriptExecution failed with a nonzero "),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("exit")]),s._v(" code\n")])])]),t("h2",{attrs:{id:"定位错误"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#定位错误"}},[s._v("#")]),s._v(" 定位错误")]),s._v(" "),t("p",[t("img",{attrs:{src:"https://cdn.jsdelivr.net/gh/FullStackAction/PicBed@resource/image/20210110221247.png",alt:""}})]),s._v(" "),t("p",[s._v("到 "),t("code",[s._v("Flutter")]),s._v(" 环境目录下，按图上所示地址找到 "),t("code",[s._v("xcode_backend.sh")]),s._v("，也可以直接看 "),t("a",{attrs:{href:"https://github.com/flutter/flutter/blob/bcc42901ad6bb3ec644be225b5f9cd998852e0ef/packages/flutter_tools/bin/xcode_backend.sh#L90-L101",target:"_blank",rel:"noopener noreferrer"}},[s._v("官方脚本链接"),t("OutboundLink")],1)]),s._v(" "),t("div",{staticClass:"language-shell extra-class"},[t("pre",{pre:!0,attrs:{class:"language-shell"}},[t("code",[s._v("  "),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# Archive builds (ACTION=install) should always run in release mode.")]),s._v("\n  "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"'),t("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$ACTION")]),s._v('"')]),s._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"install"')]),s._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&&")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"'),t("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$build_mode")]),s._v('"')]),s._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("!=")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"release"')]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("then")]),s._v("\n    EchoError "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"========================================================================"')]),s._v("\n    EchoError "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"ERROR: Flutter archive builds must be run in Release mode."')]),s._v("\n    EchoError "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('""')]),s._v("\n    EchoError "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"To correct, ensure FLUTTER_BUILD_MODE is set to release or run:"')]),s._v("\n    EchoError "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"flutter build ios --release"')]),s._v("\n    EchoError "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('""')]),s._v("\n    EchoError "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"then re-run Archive from Xcode."')]),s._v("\n    EchoError "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"========================================================================"')]),s._v("\n    "),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("exit")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[s._v("-1")]),s._v("\n  "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("fi")]),s._v("\n")])])]),t("h2",{attrs:{id:"解决方案"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#解决方案"}},[s._v("#")]),s._v(" 解决方案")]),s._v(" "),t("p",[s._v("可以看到，官方脚本的说明里面给出两个解决方案")]),s._v(" "),t("blockquote",[t("p",[s._v("方案一：直接设置 "),t("code",[s._v("FLUTTER_BUILD_MODE")]),s._v(" 为 "),t("code",[s._v("release")])]),s._v(" "),t("p",[s._v("方案二：先运行 "),t("code",[s._v("flutter build ios --release")]),s._v(" ，再使用 "),t("code",[s._v("Xcode")]),s._v(" 去打包")])]),s._v(" "),t("p",[s._v("这里我们是用 "),t("code",[s._v("Jenkins")]),s._v(" 脚本进行打包，所以方案二不适用，方案一更加方便些")]),s._v(" "),t("div",{staticClass:"language-shell extra-class"},[t("pre",{pre:!0,attrs:{class:"language-shell"}},[t("code",[t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 设置Flutter的编译模式为release")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("export")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s._v("FLUTTER_BUILD_MODE")]),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("release\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 执行原有项目的打包脚本")]),s._v("\n./script/build_iOS.sh\n")])])])])}),[],!1,null,null,null);t.default=r.exports}}]);