共用方式為


使用 App Center CLI 發行 CodePush 更新

重要

Visual Studio App Center 已排定於 2025 年 3 月 31 日淘汰。 雖然您可以繼續使用 Visual Studio App Center,直到它完全淘汰為止,但有數個建議您考慮移轉至的建議替代方案。

深入瞭解支持時程表和替代方案。

安裝

  • 安裝 Node.js
  • 安裝 App Center CLI: npm install -g appcenter-cli

開始使用

  1. 使用 命令建立 App Center 帳戶 或透過 appcenter login CLI 登入。
  2. 使用 CodePush 註冊您的應用程式,並選擇性地與小組上的其他開發人員共用您的應用程式
  3. CodePush-ify 您的應用程式,並將其指向您想要使用 (Apache Cordova 的部署,並 React Native)
  4. 針對您的應用程式發行和更新

帳戶管理

您必須先使用現有的 CodePush 帳戶登入,或建立新的 App Center 帳戶,才能開始發行應用程式更新。 安裝 CLI 之後,您可以執行下列命令來執行此動作:

appcenter login

此命令會啟動瀏覽器,要求您使用 GitHub 或 Microsoft 帳戶進行驗證。 驗證之後,它會建立 CodePush 帳戶「連結」至您的 GitHub/MSA 身分識別,並產生存取密鑰,您可以複製/貼到 CLI 以登入。

注意

註冊之後,您會自動使用 CLI 登入,因此在明確註銷之前,您不需要從同一部計算機重新登入。

驗證

App Center CLI 中的大部分命令都需要驗證,因此,您必須先開始使用註冊時使用的 GitHub 或 Microsoft 帳戶登入,才能開始管理您的帳戶。 您可以執行下列命令來執行此動作:

appcenter login

此命令會啟動瀏覽器視窗,要求您使用 GitHub 或 Microsoft 帳戶進行驗證。 它會產生要複製貼到 CLI 的存取金鑰, (它會提示您輸入) 。 您現在已成功驗證,而且可以安全地關閉瀏覽器視窗。

每當您要檢查是否已登入時,您可以執行下列命令來顯示目前驗證工作階段、使用者名稱和顯示名稱的電子郵件位址:

appcenter profile list

當您從 CLI 登入時,您的存取金鑰會在工作階段期間持續儲存到磁碟,因此您每次嘗試存取您的帳戶時都不需要登入。 若要結束您的工作階段並刪除此存取金鑰,請執行下列命令:

appcenter logout

例如,如果您忘記從不想要離開執行中的會話的電腦註銷 (,例如,朋友的膝上型電腦) ,您可以使用下列命令來列出並移除任何目前的登入會話。

appcenter tokens list
appcenter tokens delete <machineName>

存取權杖

若要針對 CodePush 服務進行驗證,而不需啟動瀏覽器,或不需要在 CI 環境中使用 GitHub 或 (Microsoft 認證,例如,在 CI 環境中) ,您可以執行下列命令來建立「存取令牌」 (,以及描述其用途的名稱) :

appcenter tokens create -d "Azure DevOps Integration"

密鑰只會顯示一次,因此請記得視需要將它儲存在某處! 建立新的金鑰之後,您可以使用 命令的 login 旗標來指定其值--token,這可讓您使用「無外設」驗證,而不是啟動瀏覽器。

appcenter login --token <accessToken>

使用此方法登入時,存取令牌不會在註銷時自動失效,而且可以在未來的會話中使用,直到從 App Center 伺服器明確移除為止。 不過,在會話完成之後,您應該註銷,以從磁碟中移除您的認證。

應用程式管理

部署更新之前,請使用下列命令使用 App Center 建立應用程式:

appcenter apps create -d <appDisplayName> -o <operatingSystem>  -p <platform> 

如果您的應用程式同時以 Android 和 iOS 為目標,強烈建議您使用 CodePush 建立個別的應用程式。 每個平臺各有一個。 如此一來,您可以個別管理和發行更新,這在長時間執行中,通常會讓事情變得更簡單。 大部分的人都會使用 和-iOS來後綴應用程式名稱-Android。 例如:

appcenter apps create -d MyApp-Android -o Android -p React-Native
appcenter apps create -d MyApp-iOS -o iOS -p Cordova

注意

針對 Android 和 iOS 使用相同的應用程式可能會導致安裝例外狀況,因為針對 iOS 產生的 CodePush 更新套件與針對 Android 產生的更新內容不同。

提示

App Center CLI 中的一個重要新功能是能夠使用 appcenter apps set-current <ownerName>/<appName>將應用程式設定為目前的應用程式。 藉由將應用程式設定為目前的應用程式,您就不需要在其他 CLI 命令中使用 -a 旗標。 例如,當 appcenter codepush deployment list -a <ownerName>/<appName> 設定目前的應用程式時,命令可以縮短為 appcenter codepush deployment list 。 您可以使用 來檢查哪些應用程式已設定為您帳戶的應用程式 appcenter apps get-current。 設定目前的應用程式可縮短輸入大部分的 CLI 命令。

使用原始 CodePush 時,應用程式會自動有兩個部署 (StagingProduction) 。 在 App Center 中,您必須使用下列命令自行建立它們:

appcenter codepush deployment add -a <ownerName>/<appName> Staging
appcenter codepush deployment add -a <ownerName>/<appName> Production

建立部署之後,您可以使用 來存取這兩個部署appcenter codepush deployment list --displayKeys的部署密鑰,您可以透過其各自的 SDK 來開始設定行動用戶端, (CordovaReact Native) 的詳細數據。

如果您決定您不喜歡提供給應用程式的名稱,您可以隨時使用下列命令重新命名它:

appcenter apps update -n <newName> -a <ownerName>/<appName>

警告

變更應用程式名稱可能會在分支組態上產生一些非預期的問題,並建置大約 48 小時。

如果某個時間點不再需要應用程式,您可以使用下列命令將它從伺服器中移除:

appcenter apps delete -a <ownerName>/<appName>

當已設定為使用此命令的任何應用程式停止接收更新時,請小心。

最後,如果您想要列出您已向 App Center 伺服器註冊的所有應用程式,請執行下列命令:

appcenter apps list

應用程式共同作業

如果您要與其他開發人員一起處理相同的 CodePush 應用程式,您可以遵循下列一組指示,使用 App Center 入口網站將其新增為共同作業者:

  1. 在 App Center 入口網站中,選取您要新增共同作業者的應用程式
  2. 在頁面左側的瀏覽區域中,按兩下 [ 設定]
  3. 按兩下 [ 共同作業者] 連結
  4. 在共同作業者功能表中,輸入共同作業者的電子郵件位址以邀請他們。

重要

App Center 的共同作業者功能預期每個共同作業者都已經使用指定的電子郵件位址 向 App Center 註冊

新增之後,所有共同作業者都會立即在共用應用程式中擁有下列許可權:

  1. 檢視應用程式、其共同作業者、 部署發行歷程記錄
  2. 發行 任何應用程式部署的更新
  3. 升級 任何應用程式部署之間的更新
  4. 復原 任何應用程式的部署
  5. 修補 任何應用程式部署內的任何版本

共同作業者無法執行下列任何動作:

  1. 重新命名或刪除應用程式
  2. 在應用程式內建立、重新命名或刪除新的部署
  3. 清除部署的版本歷程記錄
  4. 從應用程式新增或移除共同作業者 (*)

注意

開發人員可以從與其共用的應用程式中移除自己作為共同作業者。

經過一段時間后,如果有人不再與您一起處理應用程式,您也可以在入口網站中使用此共同作業者功能表,將其移除為共同作業者。

每當您想要列出已新增至應用程式的所有共同作業者時,您可以在入口網站中瀏覽共同作業者功能表。

部署管理

從 CodePush 的觀點來看,應用程式是一或多個「部署」的具名群組。 雖然應用程式代表平臺特定 (應用程式版本的概念性「命名空間」或「範圍」,例如 Foo 應用程式) 的 iOS 埠,但其部署代表針對開發人員發行更新 (的實際目標,) 和同步處理終端使用者) 的更新 (。 部署可讓您在任何指定時間讓每個應用程式都有多個「環境」,並協助模型化應用程式通常會從開發人員的個人環境移至測試/QA/預備環境,最後再進入生產環境。

注意

如您所見, releasepromoterollback 命令需要應用程式名稱和部署名稱才能運作,因為兩者的組合可唯一識別發佈點 (,例如,我想要將iOS應用程式的更新發行至Beta測試人員) 。

每當應用程式向 CodePush 服務註冊時,建議您建立下列部署: StagingProduction。 這可讓您開始將更新發行至內部環境,您可以在其中徹底測試每個更新,再將它們推送給使用者。 此工作流程對於確保發行準備好大量取用非常重要,而且是一種在 Web 中長時間建立的做法。

如果應用程式的預備和生產版本足以符合您的需求,則不需要執行任何其他動作。 不過,如果您想要 Alpha、dev 等部署,您可以使用下列命令輕鬆地建立它們:

appcenter codepush deployment add -a <ownerName>/<appName> <deploymentName>

如同應用程式,您也可以分別使用下列命令來移除和重新命名部署:

appcenter codepush deployment remove -a <ownerName>/<appName> <deploymentName>
appcenter codepush deployment rename -a <ownerName>/<appName> <deploymentName> <newDeploymentName>

每當您要檢視特定應用程式包含的部署清單時,您可以執行下列命令:

appcenter codepush deployment list -a <ownerName>/<appName>

安裝計量具有下列意義:

  • 作用 中 - 如果使用者開啟您的應用程式,則目前執行此版本的成功安裝數目 (,他們會看到/執行此版本) 。 當用戶升級至此版本和離開此版本時,此數目將會變更。 此計量會顯示作用中用戶總數,以及代表整體物件百分比的百分比。 這可讓您輕鬆地判斷使用者目前正在執行的更新散發,以及回答「我的使用者有多少人收到最新更新?」之類的問題。

  • 總計 - 此更新整體收到的成功安裝總數。 此數目只會隨著新使用者/裝置安裝而增加,因此一律是使用中計數總計的超集。 安裝更新之後 notifyApplicationReady ,一旦 (或 sync) 呼叫,就會被視為成功。 在下載更新且標示為成功時,其將會回報為「擱置」更新, (請參閱下方以取得詳細數據) 。

  • 置 - 下載此版本的次數,但尚未安裝 (應用程式重新啟動以套用變更) 。 因此,此計量會在下載更新時增加,並隨著已安裝對應的下載更新而減少。 此計量主要適用於未設定為立即安裝的更新,並協助為依賴應用程式繼續或重新啟動的應用程式提供更廣泛的發行採用,以套用更新 (例如,我想要復原更新,而且我想知道是否有任何人下載更新,但) 。 如果您已將更新設定為立即安裝,但仍看到正在回報的擱置更新,則您可能未在應用程式啟動時呼叫 notifyApplicationReady (或 sync) ,這是開始傳送安裝報告並將已安裝的更新標示為成功的方法。

  • 復原 - 此版本在用戶端上自動復原的次數。 在理想情況下,此數字應該是零,在此情況下,甚至不會顯示此計量。 不過,如果您發行的更新包含安裝程式的當機,CodePush 外掛程式會將終端用戶復原回先前的版本,並將問題回報回伺服器。 這可讓您的終端使用者在發行中斷時保持解除封鎖,並在 CLI 中查看此遙測,藉由在伺服器上 復原 錯誤版本並回應它們。

  • 推出 - 指出有資格接收此更新的使用者百分比。 此屬性只會針對代表「使用中」推出的版本顯示,因此具有小於100%的推出百分比。 此外,由於部署在任何指定時間只能有一個作用中的推出,因此此卷標只會出現在部署內的最新版本上。

  • 已停用 - 指出版本是否已標示為已停用,因此用戶可下載。 此屬性只會針對停用的版本顯示。

當計量數據格報告 No installs recorded時,表示伺服器尚未看到此版本的任何活動。 這可能是因為其排除了包含遙測支援的外掛程式版本,或使用者尚未與 CodePush 伺服器同步處理。 安裝發生時,您就會開始在 CLI 中針對版本填入計量。

發行 匯報

一旦您的應用程式設定為針對 App Center 伺服器查詢更新,您就可以開始發行更新。 為了提供簡單性和彈性,App Center CLI 包含三個不同的命令來發行更新:

  1. 一般 - 發行由外部工具或建置 (腳本產生之 App Center 伺服器的更新,例如 Gulp 工作、 react-native bundle 命令) 。 這提供最適合現有工作流程的最大彈性,因為它會嚴格處理 CodePush 特定步驟,並將應用程式特定的編譯程式保留給您。

  2. React Native - 使用與一般發行命令相同的功能,但也會處理為您產生更新的應用程式內容的工作, (JS 套件組合和資產) ,而不需要同時執行 react-native bundle 和 。appcenter codepush release

  3. Cordova - 使用與一般發行命令相同的功能,但也會為您處理準備應用程式更新的工作,而不需要您 cordova prepare 同時執行 (或 phonegap prepare) ,然後再 appcenter codepush release執行 。

您應該使用哪些命令主要是需求或喜好設定。 不過,我們建議使用相關的平臺特定命令來啟動 (,因為它可大幅簡化) 體驗,然後在需要更大的控制時使用一般用途 release 命令。

注意

用戶端只能探索及下載部署中的50個最新版本。

發行 匯報 (一般)

appcenter codepush release -a <ownerName>/<appName> -c <updateContentsPath> -t <targetBinaryVersion> -d <deploymentName>

[-t|--target-binary-version <version>]
[-с|--update-contents-path <updateContentsPath>]
[-r|--rollout <rolloutPercentage>]
[--disable-duplicate-release-error]
[-k|--private-key-path <privateKeyPath>]
[-m|--mandatory]
[-x|--disabled]
[--description <description>]
[-d|--deployment-name <deploymentName>]
[-a|--app <ownerName>/<appName>]
[--disable-telemetry]
[-v|--version]

應用程式名稱參數

此參數會指定即將發行此更新的App Center 應用程式名稱。 如果您想要查閱,您可以執行 appcenter apps list 命令來查看應用程式清單。

更新內容參數

此參數會指定您要發行之更新應用程式程式代碼和資產的位置。 例如,您可以提供單一檔案 (、React Native 應用程式) 的 JS 套件組合,或目錄 (的路徑,/platforms/ios/www例如 Cordova 應用程式的資料夾) 。 您不需要壓縮多個檔案或目錄來部署這些變更,因為 CLI 會自動為您壓縮這些變更。

您指定的路徑必須參考您應用程式的平臺特定、備妥/配套版本。 下表概述您應該在釋放之前執行的命令,以及稍後可以使用 參數參考 updateContentsPath 的位置:

平台 準備命令 相對於專案根目錄) 的套件路徑 (
Cordova (Android) cordova prepare android ./platforms/android/assets/www 目錄
Cordova (iOS) cordova prepare ios ./platforms/ios/www 目錄
(Android) React Native wo/assets react-native bundle --platform android --entry-file <entryFile> --bundle-output <bundleOutput> --dev false 選項的值 --bundle-output
React Native android) (w/assets react-native bundle --platform android --entry-file <entryFile> --bundle-output <releaseFolder>/<bundleOutput> --assets-dest <releaseFolder> --dev false --assets-dest選項的值,這應該代表新建立的目錄,其中包含應用程式的資產和 JS 套件組合
React Native wo/assets (iOS) react-native bundle --platform ios --entry-file <entryFile> --bundle-output <bundleOutput> --dev false 選項的值--bundle-output
React Native (iOS) react-native bundle --platform ios --entry-file <entryFile> --bundle-output <releaseFolder>/<bundleOutput> --assets-dest <releaseFolder> --dev false --assets-dest選項的值,這應該代表新建立的目錄,其中包含應用程式的資產和 JS 套件組合

目標二進位版本參數

此參數會指定您要發行更新之應用程式的存放區/二進位版本,因此只有執行該版本的使用者會收到更新,而執行舊版或更新版本的應用程式二進制檔的使用者將不會。 基於下列原因,它很有用:

  1. 如果使用者執行較舊的二進位版本,則 CodePush 更新中可能會有中斷性變更,且無法與其執行的內容相容。

  2. 如果使用者正在執行較新的二進位版本,則假設其執行的內容較新 (且可能與 CodePush 更新不相容) 。

如果您想要更新以應用程式市集二進位檔的多個版本為目標,我們也可讓您將 參數指定為 semver 範圍表達式。 如此一來,任何執行符合範圍表達式之二進位檔版本的用戶端裝置, (semver.satisfies(version, range) 會傳回 true) 取得更新。 有效 semver 範圍表示式的範例如下:

範圍表達式 誰取得更新
1.2.3 只有執行您應用程式特定二進位版本的 1.2.3 裝置
* 任何設定為從 CodePush 應用程式取用更新的裝置
1.2.x 執行主要第 1 版、次要版本 2 和應用程式任何修補程式版本的裝置
1.2.3 - 1.2.7 (內含) 與 1.2.7 (內含) 之間1.2.3執行任何二進位版本的裝置
>=1.2.3 <1.2.7 (內含) 與1.2.7獨佔 (獨佔) 之間1.2.3執行任何二進位版本的裝置
1.2 相當於 >=1.2.0 <1.3.0
~1.2.3 相當於 >=1.2.3 <1.3.0
^1.2.3 相當於 >=1.2.3 <2.0.0

注意

如果應用程式的 semver 表達式以特殊殼層字元或運算符開頭,例如 >^或 ** *,如果您未將值包裝在引號中,命令可能無法正確執行,因為殼層不會提供正確的值給 CLI 進程。 因此,最好在呼叫 release 命令時,以雙引號包裝應用程式的 targetBinaryVersion 參數,例如 appcenter codepush release -a <ownerName>/<appName> updateContents ">1.2.3"

下表概述 CodePush 預期更新的 semver 範圍符合每個個別應用程式類型的版本值:

平台 二進位版本的來源
Cordova <widget version>config.xml 檔案中的屬性
React Native (Android) 專案 android.defaultConfig.versionNamebuild.gradle 檔案中的 屬性
React Native (iOS) CFBundleShortVersionStringInfo.plist 檔案中的索引鍵
React Native (Windows) <Identity Version>Package.appxmanifest 檔案中的密鑰

注意

例如,如果元數據檔中的二進位版本遺漏修補程式版本, 2.0則會將其視為具有的修補程式版本 02.0 -> 2.0.0也就是 。

部署名稱參數

此參數會指定要釋放更新的部署。 它預設為 Staging,但當您準備好部署至 Production或自己的其中一個自定義部署時,只要明確設定這個自變數即可。

提示

您可以使用 或 -d來設定 --deployment-name 參數。

Description 參數

此參數提供部署的選擇性「變更記錄」。 此值會四捨五入到用戶端,以便在偵測到更新時,您的應用程式可以選擇將它顯示給使用者 (例如,透過 [新功能?] 對話框) 。 此字串會接受控制字元,例如 \n\t ,因此您可以在描述中包含空格符格式,以改善可讀性。

提示

您可以使用 來設定 --description此參數。

Disabled 參數

此參數會指定使用者是否應該下載更新。 如果未指定,將不會停用更新。 相反地,使用者會在您的應用程式呼叫 sync時下載它。 如果您想要釋放無法立即使用的更新,此參數可能很重要,直到您明確 修補, 並想要終端用戶下載它 (例如,公告部落格文章上線) 。

提示

您可以使用 或 -x來設定--disabled此參數。

強制參數

此參數會指定更新是否應視為強制 (更新,例如,它包含重要的安全性修正程式) 。 這個屬性會四捨五入給客戶端,然後可以決定他們是否要強制執行它。

注意

此參數是「旗標」,因此其不存在表示發行是選擇性的,而其存在則表示它是強制性的。 您可以 (提供值給它, --mandatory true 例如,) ,不過,指定 --mandatory 就足以將發行標示為必要。

強制屬性是唯一的,因為伺服器會視需要動態修改它,以確保應用程式的版本語意會保留給終端使用者。 例如,假設您已將下列三個更新發行至您的應用程式:

發行 是否為強制?
v1
v2 Yes
v3 No

如果使用者目前正在執行 v1,而且他們會查詢伺服器以取得更新,它會回應 v3 (,因為這是最新的) ,但它會動態地將發行轉換成強制版本,因為強制更新已在兩者之間發行。 此行為很重要,因為中包含的 v3 程式代碼會累加至 中包含的 v2。 任何強制 v2 專案都會繼續強制 v3 ,讓尚未取得的任何人成為 v2必要專案。

如果使用者目前正在執行 v2,而且他們會查詢伺服器以取得更新,它會以 v3回應 ,但將發行保留為選擇性。 這是因為他們已經收到強制更新,因此不需要修改的原則 v3。 此行為是為什麼我們說伺服器會「動態轉換」強制旗標,因為只要發行,其強制屬性一律會使用您在釋放時指定的值來儲存。 只有在回應終端使用者的更新檢查時,才會視需要即時變更。

如果您發行標示為 mandatory的更新,則描述的行為僅適用於您。 如果有相互關聯的mandatory更新,伺服器只會將發行變更optionalmandatory ,如上所示。

標示為 mandatory 的版本永遠不會轉換成 optional

提示

您可以使用 或 來設定 --mandatory 此參數 -m*

沒有重複的發行錯誤參數

此參數會指定如果更新與部署上的最新版本相同,CLI 應該會產生警告,而不是錯誤。 它適用於預期小型修改可能會觸發未變更生產程式代碼的發行的持續整合案例。

推出參數

重要

為了讓此參數生效,您的終端用戶必須針對 Cordova) 執行版本 1.6.0-beta+ (,或 1.9.0-beta+ (,才能 React Native) CodePush 外掛程式。 如果您發行指定推出屬性的更新,則執行舊版 Cordova 或 React Native 外掛程式的使用者將無法進行更新。 在您如先前) 所述採用平臺特定 CodePush 外掛程式的必要版本 (之前,我們不建議在應用程式的版本中設定推出值,因為沒有人最終會收到它。

此參數會將使用者 (的百分比指定為介於 和 100) 之間的1整數,且應該符合接收此更新的資格。 如果您想要「正式發行前小眾測試」新版本,其中一部分的應用程式物件 (例如 25%) ,並取得意見反應,或 watch 例外狀況或當機,然後再讓每個人廣泛使用。 如果未設定此參數,則會預設為 100%。 您只需要將它設定為限制有多少使用者會收到它。

使用推出功能時,請記住一些額外的考慮:

  1. 您無法發行部署的新更新,其最新版本為「作用中」推出, (其首度發行屬性為非 Null) 。 必須先「完成」推出, (將 rollout 屬性設定為 100) ,才能發行部署的進一步更新。

  2. 如果您復原最新版本為「作用中」首度發行的部署,將會清除首度發行值,有效地「停用」推出行為

  3. mandatory不同於 和 description 欄位,當您將發行從某個部署升階到另一個部署時,它不會傳播 rollout 屬性,因此,如果您希望目標部署中的新版本 () 有推出值,您必須在呼叫 promote 命令時明確設定它。

提示

您可以使用 或 來設定 --rollout 此參數 -r*

釋放 匯報 (React Native)

appcenter codepush release-react -a <ownerName>/<appName> -d <deploymentName> -t <targetBinaryVersion>
[-t|--target-binary-version <targetBinaryVersion>]
[-o|--output-dir]
[-s|--sourcemap-output]
[-c|--build-configuration-name <arg>]
[--plist-file-prefix]
[-p|--plist-file]
[-g|--gradle-file]
[-e|--entry-file]
[--development]
[-b|--bundle-name <bundleName>]
[-r|--rollout <rolloutPercentage>]
[--disable-duplicate-release-error]
[-k|--private-key-path <privateKeyPath>]
[-m|--mandatory]
[-x|--disabled]
[--description <description>]
[-d|--deployment-name <deploymentName>]
[-a|--app <ownerName>/<appName>]
[--disable-telemetry]
[-v|--version]

release-react此命令是 「vanilla」 release 命令的 React Native 特定版本,可支援 (的所有相同參數,--mandatory例如 、 --description) ,但會執行下列額外工作來簡化發行更新的程式:

  1. 執行 react-native bundle 命令來產生即將發行至 CodePush 伺服器的 更新內容 (JS 套件組合和資產) 。 它會盡可能使用合理的預設值 (,例如建立非開發人員組建,假設 iOS 專案檔名為 index.ios.js) ,但也會公開相關的 react-native bundle 參數,以啟用彈性 (例如) --sourcemap-output

  2. targetBinaryVersion使用適用於 iOS) 的專案 Info.plist (中指定的版本名稱,以及 Android) 檔案的 build.gradle (,推斷此版本的 。

為了說明命令可以產生的差異release-react,下列範例示範如何使用 「vanilla」 release 命令產生和釋放 React Native 應用程式的更新:

mkdir ./CodePush

react-native bundle --platform ios \
--entry-file index.ios.js \
--bundle-output ./CodePush/main.jsbundle \
--assets-dest ./CodePush \
--dev false

appcenter codepush release -a <ownerName>/MyApp-iOS -c ./CodePush -t 1.0.0

使用 命令達成對等的行為 release-react 需要下列命令,這較不容易出錯:

appcenter codepush release-react -a <ownerName>/MyApp-iOS

應用程式名稱參數

其參數與 上一節中所述的參數相同。

部署名稱參數

其參數與 上一節中所述的參數相同。

描述參數

其參數與 上一節中所述的參數相同。

強制參數

其參數與 上一節中所述的參數相同。

沒有重複的發行錯誤參數

其參數與 上一節中所述的參數相同。

推出參數

其參數與 上一節中所述的參數相同。 如果未指定版本,將會提供給所有使用者使用。

目標二進位版本參數

其參數與 上一節中所述的參數相同。 如果未指定,預設會以適用於 iOS) 的應用程式 Info.plist (中指定的確切版本為目標,並針對 Android) 檔案 設定 build.gradle (。

套件組合名稱參數

此參數會指定應該用於所產生 JS 套件組合的檔案名。 如果未指定,則會將標準套件組合名稱用於指定的平臺: main.jsbundle (iOS) 、 index.android.bundle (Android) ,以及 index.windows.bundle (Windows) 。

提示

您可以使用 或 來設定 --bundle-name 此參數 -b*

開發參數

這個參數會指定是否產生未受管理的開發 JS 套件組合。 如果未指定,則會預設為 false 停用警告的位置,並縮小套件組合。

提示

您可以使用 來設定此參數 --development*

Disabled 參數

其參數與 上一節中所述的參數相同。

專案檔案參數

此參數會指定應用程式根/專案 JavaScript 檔案的相對路徑。 如果未指定,則預設為 iOS )index.ios.js(、適用於Android) 的index.android.js( ,或 Windows) 的 index.windows.bundle (,否則為 index.js

提示

您可以使用 或 來設定 --entry-file 此參數 -e*

僅限 Android) (Gradle 檔案參數

此參數會指定在嘗試自動偵測發行目標二進位版本時,CLI 應該使用的 build.gradle 檔案相對路徑。 此參數僅適用於進階案例,因為 CLI 可以在 「standard」 React Native 項目中自動尋找專案的 build.gradle 檔案。 不過,如果專案的 gradle 檔案位於任意位置,則 CLI 無法探索,則使用此參數可讓您繼續發行 CodePush 更新,而不需要明確設定 --target-binary-version 參數。 由於 build.gradle 是必要的檔名,因此指定包含資料夾的路徑或檔案本身的完整路徑都會達到相同的效果。

appcenter codepush release-react -a <ownerName>/MyApp-Android  -g "./foo/bar/"
appcenter codepush release-react -a <ownerName>/MyApp-Android  -g "./foo/bar/build.gradle"

提示

您可以使用 或 來設定 --gradle-file 此參數 -g*

僅限 iOS (plist 檔案參數)

此參數會指定嘗試自動偵測發行目標二進位版本時,CLI 應該使用 之 Info.plist 檔案的相對路徑。 此參數僅適用於進階案例,因為 CLI 可以在 「standard」 React Native 項目中自動尋找專案的 Info.plist 檔案,而且您可以使用 --plistFilePrefix 參數來支持個別環境 plist 檔案 (,例如 STAGING-Info.plist) 。 不過,如果專案的 plist 位於任意位置,則 CLI 無法探索,則使用此參數可讓您繼續發行 CodePush 更新,而不需要明確設定 --target-binary-version 參數。

appcenter codepush release-react -a <ownerName>/MyApp-iOS -p "./foo/bar/MyFile.plist"

提示

您可以使用 或 來設定 --plist-file 此參數 -p*

僅限 iOS (plist 檔案前置詞參數)

此參數會指定嘗試自動偵測發行目標二進位版本的 Info.plist 檔案時,該 CLI 應該使用的檔名前置詞。 如果您已建立個別環境 plist 檔案 (,例如 DEV-Info.plistSTAGING-Info.plist) ,而且您想要發行 CodePush 更新,而不需要明確設定 --target-binary-version 參數,這非常有用。 藉由指定 --plist-file-prefix,CLI 會在下列位置尋找名為 <prefix>-Info.plist的檔案,而不是 Info.plist (,這是預設行為) : ./ios./ios/<appName>。 例如,如果專案的 plist 檔案不在其中一個目錄 (,則您的應用程式是內嵌 RN 檢視) 的原生 iOS 應用程式,或使用完全不同的檔案命名慣例,請考慮使用 --plist-file 參數。

# Autodetect the target binary version of this release by looking up the
# app version within the STAGING-Info.plist file in either the ./ios or ./ios/<APP> directories.
appcenter codepush release-react -a <ownerName>/MyApp-iOS  --plist-file-prefix "STAGING"

# Tell the CLI to use your dev plist (`DEV-Info.plist`).
# The hyphen separator can be explicitly stated.
appcenter codepush release-react -a <ownerName>/MyApp-iOS --plist-file-prefix "DEV-"

來源對應輸出參數

此參數會指定應該寫入所產生 JS 套件組合來源對應檔的相對路徑。 如果未指定,將不會產生來源對應。

提示

您可以使用 或 來設定 --sourcemap-output 此參數 -s*

組建組態名稱

建置組態的名稱,指定您要以這個版本為目標的二進位版本。 例如,「偵錯」或「發行」 (iOS 僅) 。

注意

使用 Xcode 11 和更新版本建置時,應該使用此參數來覆寫 Xcode 所使用的預設組態。

釋放 匯報 (Cordova)

appcenter codepush release-cordova -a <ownerName>/<appName> -d <deploymentName> -t <targetBinaryVersion>
[-t|--target-binary-version <targetBinaryVersion>]
[--is-release-build-type]
[-b|--build]
[-r|--rollout <rolloutPercentage>]
[--disable-duplicate-release-error]
[-k|--private-key-path <privateKeyPath>]
[-m|--mandatory]
[-x|--disabled]
[--description <description>]
[-d|--deployment-name <deploymentName>]
[-a|--app <ownerName>/<appName>]
[--disable-telemetry]
[-v|--version]

此命令release-cordova是 「vanilla」 release 命令的 Cordova 特定版本,支援所有相同的參數 (,例如 、 --mandatory--description) ,但執行下列其他工作來簡化發行更新的程式:

  1. 執行 cordova prepare (或 phonegap prepare) 命令來產生 更新內容 , (www 資料夾) 發行至 CodePush 伺服器。

  2. 使用項目 config.xml 檔案中指定的版本名稱來推斷targetBinaryVersion此版本的 。

為了說明命令可以產生的差異 release-cordova ,下列範例示範如何使用 「vanilla」 release 命令產生並釋放 Cordova 應用程式的更新:

cordova prepare ios
appcenter codepush release -a <ownerName>/MyApp-iOS -c ./platforms/ios/www -t 1.0.0

使用 命令達成對等的行為 release-cordova 需要下列命令,這較不容易出錯:

appcenter codepush release-cordova -a <ownerName>/MyApp-iOS

應用程式名稱參數

它與 上一節所述的參數相同。

部署名稱參數

它與 上一節所述的參數相同。

Description 參數

它與 上一節所述的參數相同。

強制參數

它與 上一節所述的參數相同。

沒有重複的發行錯誤參數

它與 上一節所述的參數相同。

推出參數

它與 上一節所述的參數相同。 如果未指定,則發行將會提供給所有使用者使用。

目標二進位版本參數

它與 上一節所述的參數相同。 如果未指定,此命令預設只會以專案元數據中的指定版本為目標, (Info.plist ,如果此更新適用於 iOS 用戶端,則為 Android 用戶端) 的 build.gradle

Disabled 參數

它與 上一節所述的參數相同。

組建參數

此參數會指定您是否要在產生更新的 Web 資產時執行 cordova build ,而不是 cordova prepare (這是預設行為) 。 如果您的專案在建置勾點之前或之後包含 (,以轉譯 TypeScript) ,因此,讓 CodePush 執行 cordova prepare 並不足以建立和發行更新,這非常有用。 如果保留未指定,則預設為 false

提示

您可以使用 或 來設定 --build 此參數 -b*

修補更新元數據

發行更新之後,在某些情況下,您可能會想要修改一或多個元數據屬性 (,例如,您忘記將重大錯誤修正標示為必要,您想要增加更新的推出百分比) 。 您可以執行下列命令,輕鬆地執行此動作:

appcenter codepush patch -a <ownerName>/<appName> <deploymentName> <existing-release-label>
[-r|--rollout <rolloutPercentage>]
[-d|--description <description>]
[-t|--target-binary-version <targetBinaryVersion>]
[-a|--app <ownerName>/<appName>]
[--disable-telemetry]
[-v|--version]

注意

此命令不允許修改發行 (的實際更新內容, www 例如 Cordova 應用程式的資料夾) 。 如果您想要回應已識別為中斷的版本,您應該使用 rollback 命令立即回復,然後在必要時,使用適當的修正程序發行新的更新。

除了 <ownerName>/<appName>deploymentName之外,所有參數都是選擇性的,因此,您可以使用此命令一次更新單一屬性或全部屬性。 patch呼叫 命令而不指定任何屬性旗標會導致無作業。

# Mark the latest production release as mandatory
appcenter codepush patch -a <ownerName>/MyApp-iOS Production -m

# Increase the rollout for v23 to 50%
appcenter codepush patch -a <ownerName>/MyApp-iOS Production v23 -rollout 50%

標籤參數

指出您要在指定部署內更新的發行 () v23 。 如果省略,要求的變更將會套用至指定部署中的最新版本。 若要查閱您要更新之版本的標籤,您可以執行 appcenter codepush deployment history 命令並參考資料 Label 行。

強制參數

它與 上一節所述的參數相同,可讓您更新是否應該將版本視為必要版本。 請注意 --mandatory--mandatory true 相等,但缺少此旗標不等於 --mandatory false。 如果省略 參數,則不會對目標版本強制屬性的值進行任何變更。 將此參數設定為 --mandatory false ,以明確地讓發行成為選擇性。

Description 參數

它與 上一節所述的參數相同,而且可讓您更新發行 (的描述,例如,您在發行時發出錯字,或忘記在所有) 新增描述。 如果省略此參數,則不會變更目標版本的描述屬性的值。

Disabled 參數

它與 上一節所述的參數相同,可讓您更新是否應該停用版本。 請注意 --disabled--disabled true 是相等的,但缺少此旗標不等於 --disabled false。 如果省略 參數,則不會對目標版本停用屬性的值進行任何變更。 如果先前已停用,請將此參數設定為 --disabled false ,以明確取得發行。

推出參數

它與 上一節所述的參數相同,可讓您增加目標發行的推出百分比。 此參數只能設定為大於目前首度發行值的整數。 此外,如果您想要「完成」推出,並將發行提供給所有人使用,您可以將此參數設定為 --rollout 100。 如果省略此參數,則不會對目標發行首度發行參數的值進行任何變更。

此外,如前所述,當您在沒有推出值的情況下發行更新時,它相當於將推出設定為 100。 如果您在未推出的情況下發行更新,就無法透過 patch 命令變更其推出屬性,因為這會被視為降低推出百分比。

目標二進位版本參數

它與 上一節所述的參數相同,並可讓您更新 semver 範圍,指出發行與哪個二進位版本相容。 例如,如果您在最初發行更新 (時發生錯誤,但指定 1.0.0 但意 1.1.0 指) ,或您想要增加或減少版本支援的版本範圍 (,例如,您發現發行在所有) 之後都無法運作 1.1.2 ,這非常有用。 如果省略此參數,則不會對目標版本版本屬性的值進行任何變更。

# Add a "max binary version" to an existing release
# by scoping its eligibility to users running >= 1.0.5
appcenter codepush patch -a <ownerName>/MyApp-iOS Staging -t "1.0.0 - 1.0.5"

提升 匯報

一旦您針對特定部署測試更新 (, Staging 例如) ,而且您想要將其升階為「下游」 (,例如開發>預備、預備生產>) ,您可以使用下列命令,將發行從一個部署複製到另一個部署:

appcenter codepush promote -a <ownerName>/<appName> -s <sourceDeploymentName> -d <destDeploymentName>
[-s|--source-deployment-name <sourceDeploymentName>]
[-d|--destination-deployment-name <destDeploymentName>]
[-t|--target-binary-version <targetBinaryVersion>] 
[-r|--rollout <rolloutPercentage>]
[--disable-duplicate-release-error]
[--description <description>]
[-a|--app <ownerName>/<appName>] 
[--disable-telemetry] 

此命令 promote 會為目的地部署建立新版本,其中包含最新版來源部署的 確切程式代碼和元數據 (描述、強制和目標二進位版本) 。 雖然您可以使用 release 命令來「手動」將更新從某個環境移轉至另一個環境,但 promote 命令有下列優點:

  1. 其速度較快,因為您不需要重新組合您想要發行的版本資產,或記住來源部署版本的描述/二進位版本。

  2. 較不容易發生錯誤,因為升級作業可確保您已在來源部署中測試的確切專案 (例如, Staging) 會在目的地部署 (變成作用中,例如 Production ,) 。

我們建議所有使用者都利用自動建立 Staging 的環境 Production ,並直接 Staging對所有版本執行 ,然後在 promote 適當的測試之後從 StagingProduction 到 。

描述參數

它與 上一節所述的參數相同,可讓您覆寫將用於升級版本的描述。 如果未指定,新版本將會從要升級的版本繼承描述。

Disabled 參數

它與 上一節所述的參數相同,可讓您覆寫將用於升級版本的停用旗標值。 如果未指定,新版本將會從要升級的版本中繼承已停用的屬性。

強制參數

它與 上一節所述的參數相同,可讓您覆寫將用於升級版本的強制旗標。 如果未指定,新版本將會從要升級的版本中繼承強制屬性。

沒有重複的發行錯誤參數

其參數與 上一節中所述的參數相同。

推出參數

它與 上一節所述的參數相同,可讓您指定新建立的版本是否只可供部分使用者使用。 不同於其他發行元數據參數 (例如, description) , rollout 發行的 不會隨著升級而過度繼承,因此,如果您不想讓新建立的版本可供所有使用者使用,則必須明確地設定此設定。

目標二進位版本參數

它與 上一節所述的參數相同,可讓您覆寫將用於升級版本的目標二進位版本。 如果未指定,新版本將會從要升級的版本繼承目標二進位版本屬性。

# Promote the release to production and make it
# available to all versions using that deployment
appcenter codepush promote -a <ownerName>/MyApp-iOS -s Staging -d Production -t "*"

回復 匯報

部署的發行歷程記錄是不可變的,因此您無法在更新發行後刪除或移除更新。 不過,如果您發行中斷或包含非預期功能的更新,您可以使用 命令輕鬆地復原 rollback 它:

appcenter codepush rollback <ownerName>/<appName> <deploymentName>
appcenter codepush rollback -a <ownerName>/MyApp-iOS Production

執行此命令會為部署建立新版本,其中包含與最新版本之前的版本 完全相同的程式代碼和元數據 。 例如,假設您已將下列更新發行至您的應用程式:

發行 描述 強制性
v1 初始版本! Yes
v2 已新增新功能 No
v3 錯誤修正 Yes

如果您在該部署上執行 rollback 命令,則會建立包含發行內容的v2新版本 (v4) 。

發行 描述 強制性
v1 初始版本! Yes
v2 已新增新功能 No
v3 錯誤修正 Yes
v4 (從 v3 復原到 v2) 已新增新功能 No

應用程式進行更新檢查時,已取得 v3 的用戶現在會「移回」至 v2 。 此外,任何仍在執行 v2的使用者,因此從未取得 v3過 ,因此不會收到更新,因為它們已經在執行最新版本 (這就是為什麼我們的更新檢查除了發行卷標) 之外,也會使用套件哈希的原因。

如果您想要將部署復原至先前 (以外的版本, v3 例如 ->v2) ,您可以指定選擇性 --target-release 參數:

appcenter codepush rollback -a <ownerName>/MyApp-iOS Production --target-release v34

注意

復原所產生的版本將會在命令的 deployment history 輸出中加上批注,以協助更輕鬆地識別它們。

檢視發行歷程記錄

您可以使用下列命令,檢視特定應用程式部署 50 個最新版本的歷程記錄:

appcenter codepush deployment history -a <ownerName>/<appName> <deploymentName>

歷程記錄會顯示每個發行 (的所有屬性,例如標籤、強制) ,以及指出是否因為升級或復原作業而建立任何版本。

部署歷程記錄

此外,歷程記錄會顯示每個版本的安裝計量。 您可以檢視有關如何解譯上述命令檔中 deployment list 計量數據的詳細數據。

清除發行歷程記錄

您可以使用下列命令清除部署的發行歷程記錄:

appcenter codepush deployment clear -a <ownerName>/<appName> <deploymentName>

執行此命令之後,設定為使用其相關聯部署密鑰接收更新的用戶端裝置將不再收到已清除的更新。 此命令無法復原,因此不應用於生產環境部署。

程式碼簽署

這是什麼?

程式代碼簽署是建立套件組合數字簽名的方式,稍後可以在安裝之前於用戶端上驗證。

為何需要如此?

開發人員想要知道他們寄送的程式代碼是他們撰寫的程序代碼。 程式代碼簽署是提供這類保證的主要機制,可協助減輕或消除整個類別的攔截式攻擊。

如何運作?

首先,開發人員會產生非對稱密鑰組:私鑰將用於簽署套件組合;套件組合簽章驗證的公鑰。 CodePush CLI 接著會使用私鑰在 和 release-reactrelease-cordova 命令期間release簽署套件組合。 公鑰隨附於行動應用程式。 控制金鑰的產生和管理,是開發人員的手上。

在發行命令結束時,CLI 會計算套件組合的內容哈希,並將此值放入以私鑰簽署的 JWT 中。 當 CodePush 外掛程式將套件組合下載至裝置時,它會檢查 .codepushrelease 包含 JWT 的檔案,並使用公鑰驗證 JWT 簽章。 如果驗證失敗,則不會安裝更新。

使用此功能的需求

如果您打算使用此功能,請執行下列步驟:

  1. 產生新的二進位更新,包括

    • 已更新支援程式代碼簽署的 CodePush 外掛程式
    • 設定您的程式代碼推送 sdk 以使用公鑰 (請參閱 iOSAndroid) 或 Cordova SDK (的相關 React Native SDK 小節,以取得詳細數據)
  2. 產生以新二進位版本為目標的新 CodePush 更新,並指定 --private-key-path (或 -k) 參數值

請參閱我們的相容性資料表,以識別您的 SDK/CLI 是否支援程式代碼簽署功能:

CodePush SDK 支援程式代碼簽署的版本 支援的平台 所需的最低 CodePush CLI 版本
react-native-code-push 5.1.0 Android、iOS 2.1.0
cordova-plugin-code-push 1.10.0 Android、iOS 2.1.2

金鑰產生

程式代碼簽署支援 PEM 編碼的 RSA 金鑰, (非憑證) 進行簽署。 您可以透過openssl產生它們,如下所示:

# generate private RSA key and write it to private.pem file
openssl genrsa -out private.pem

# export public key from private.pem into public.pem
openssl rsa -pubout -in private.pem -out public.pem

產生的金鑰範例:

# public key
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4moC3GsqF7YISFMQ0fnU
0rUF2xhxNqSGx9/GTxCynsQhR3hceroDXj3rAOTxnNkePB27uZfRDHrH3/LLoj9V
k2ghKRtfjDwXa85uDK8slSQDB9ZlD1TLQEJDZpKr1OTXY9VwbgtFaotSXoFmG3MO
RQeALCbrAgDxQ5Q2kJn6rfBuBoszfUz1qZqrlrY74Axerv1/UtTjL8uyF5r00Bxj
kvTveC2Pm5A3kq6QANktgfKWy9Ugs/4ykZF7fxfH+ukJW+iXwLACrdfzhegg/41H
5w06m30h0jqhIBZ3nbj5MN+qVbANHJMjz+fXqXx1Ovr1DfGtdKOku/BTWDxojCl1
iwIDAQAB
-----END PUBLIC KEY-----

# private key
-----BEGIN RSA PRIVATE KEY-----
MIIEowIBAAKCAQEA4moC3GsqF7YISFMQ0fnU0rUF2xhxNqSGx9/GTxCynsQhR3hc
eroDXj3rAOTxnNkePB27uZfRDHrH3/LLoj9Vk2ghKRtfjDwXa85uDK8slSQDB9Zl
D1TLQEJDZpKr1OTXY9VwbgtFaotSXoFmG3MORQeALCbrAgDxQ5Q2kJn6rfBuBosz
fUz1qZqrlrY74Axerv1/UtTjL8uyF5r00BxjkvTveC2Pm5A3kq6QANktgfKWy9Ug
s/4ykZF7fxfH+ukJW+iXwLACrdfzhegg/41H5w06m30h0jqhIBZ3nbj5MN+qVbAN
HJMjz+fXqXx1Ovr1DfGtdKOku/BTWDxojCl1iwIDAQABAoIBAQCdwf/8VS8fFlbv
DfHKXKlNp5RM9Nrtl/XRjro+nQPYXBBUHClT2gg+wiXcmalAAIhwmscSqhWe/G4I
PMRmaHrYGtYALnKE49nt5AgKDoSh5lW2QExqQkrcm08bSVcxH8J0bWPJSVE0y564
+rCKr8BhmLhWC0f0PXPeAoeCeceRKYX2oDgO8A0yZRSQUdRWiXOiQ4mUQ3IPCmBc
gD1JJNZ5kR4O904PZz5pbgyvN2t5BKOgLKq+x+8Pa8Rb21rFZKMHO8W04oKaRiGs
f4xwOBAWDOfzDKJzT5xepcPyycgjxcuvyKB2g8biWnDGGOTxDgqMX+R4XeP1aISC
h9bzfRoBAoGBAPREuPhIXRJOsIgSWAAiC5vhLZ9wWELWG95eibQm2SfpY4F0sPpE
lNQJ4yzC7J4BiApFzs1yxwwRmgpVd+wF9iMb4NSzaiTM7fju/Xv4aGhBqRXEokGF
v3QxIlbAwBqeL0rJAAadjbUTTO/u6sC80LI3bfPrn/z1hupZQGR559gjAoGBAO1J
xQ2ODVS4dSH2P+Ocd9LiUBPGyV97+MFixh6z1c2Fd3bNuiIhCxkrng45Dq0CkX84
nPUvtYxEQZoFvyB7gAm0SVlLHnJwBiq+Mp9g0UXSy6rZbjhiFkQs1W/W+Z2OIDsC
y+uXZT7No/J9VyjdrWzZJaBImO8/E4NONXWn8M95AoGACH97j+e0lTZ3ncRFm3uT
u9CRrcJSz8BzJ8FSORpA48qS06YjohFQvC+734rIgJa9DN5w22Tq19ik60cd7PAo
KACISd4UC0O147ssxmtV9oqSP1ef7XehuYEcGLiL9mEadBeaEKDalToeqxo8wIfR
GuIiySGhZ0ODdhO00coL7tECgYBargddD70udDNnICj4PbJY5928QQpxr/m3RZz6
3LTHDstBnosUQdZw7wc+3jUqjsG1gZgR5wKVMPx09N8+dZPPoZMqSZfAGelxajAE
UkaHTXBBwUfqyilCMnP6gofv2wGcK4xsYvXxEzslDxtA5b5By5Yic7vmKg+17Sxm
4yAW2QKBgDyEUzXq3Rrm7ZT720pPhuQDDSO0eHe1L1MUjTRsJ96GkIl0iqQCVgK8
A/6rFFTEeVf8L6GNMTwdtnDFz/CqIU+K1X4HLXmUY2suffWVxZ4KYqiEszCbyrdO
puayMcrx2unhKQyDYjUvD8GxHyquA+p52KDke2TkKfDxfzv0WOE1
-----END RSA PRIVATE KEY-----

發行已簽署的更新

若要發行已簽署的更新,您應該針對 或 命令使用 --private-key-path (或 -k) 選項。release-reactrelease