常用指令
您的日常工作流程只需要幾個 Rush 指令
rush update
請記得在任何 package.json 檔案變更時執行 rush update
。換句話說:
- 從 Git 提取新變更後 (例如
git pull
) - 以任何方式手動編輯任何專案的 package.json 檔案後
- 編輯任何會影響版本的 common/config 檔案後 (例如 pnpmfile.js、common-versions.json 等)
rush update
操作可能會變更 common/config 下的一些檔案。如果是這樣,您應該將這些變更提交至 Git 並將它們包含在您的 PR 中。如有疑問,請執行 rush update
-- 如果一切都已更新,則不會花費任何時間!
rush update
的作用
- Rush 會檢查/套用各種政策,這些政策有時會更新 common/config 下的檔案。
- Rush 會將您所有專案的 package.json 檔案與儲存庫的共用鎖定檔進行比較,以查看是否有效。
- 如果過期,套件管理員會更新鎖定檔。
- 無論如何,套件管理員都會將所有依賴項目安裝到 common/temp/node_modules 資料夾中。
- 最後,Rush 會為每個專案建構一個本機 node_modules 資料夾,方法是連結到 common/temp/node_modules。(這與
rush link
的操作相同。)
這個「鎖定檔」是什麼?
大多數專案不會為依賴項目指定精確的版本,例如
1.2.3
,而是指定 SemVer 範圍,例如1.x
或^1.2.3
。就其本身而言,這表示安裝的內容取決於當時的最新版本。這種非決定性是不好的:在星期一建置的 Git 分支可能會因為新發佈的程式庫而在星期二莫名其妙地失敗,這會讓人抓狂。鎖定檔透過將完整的安裝計畫儲存在 Git 追蹤的大型檔案中來解決這個問題。鎖定檔的名稱會因您的儲存庫正在使用的套件管理員而異:shrinkwrap.yaml、npm-shrinkwrap.json 或 yarn.lock
您會注意到自動 CI 作業使用 rush install
而不是 rush update
。不同之處在於 rush install
不會更新任何檔案。相反地,如果某些內容過期,它會使您的 PR 建置失敗,以通知您忘記執行 rush update
或忘記提交結果。(有些人選擇將 rush install
作為他們的日常指令,以便找出對鎖定檔的非預期變更。)
rush rebuild
提取最新變更後,是時候編譯所有內容了。rush rebuild
會對儲存庫中的每個專案執行完整、乾淨的建置。
如果您的工具鏈支援增量建置,您也可以使用 rush build
來僅建置已變更的專案。
rushx
如果您只想建置一個專案,可以使用 rushx
指令。您在您要操作的專案資料夾下執行它。rushx
指令類似於 npm run
,但輸入較少、錯誤報告略佳,且具有命令列說明。
rush check
編輯 package.json 檔案後,您可以執行 rush check
以查看是否有複數專案依賴於相同程式庫的不同版本。在單一儲存庫環境中,這是不理想的。許多儲存庫會將 rush check
作為 CI 建置步驟使用,因此如果您引入並排版本,它們會使您的 PR 建置失敗。
rush change
如果您在作為 NPM 套件發佈的程式庫上工作,您的儲存庫可能要求您將變更記錄項目包含在您的 PR 中。您將會知道,因為您的 PR 建置將在 rush change --verify
步驟失敗。
若要撰寫變更記錄,請先將任何擱置的工作提交至 Git。然後,在您的儲存庫工作資料夾下的任何位置輸入 rush change
。此指令將檢查您的 Git 歷程記錄,以判斷哪些專案資料夾有差異。根據這一點,它會提示您為每個專案撰寫變更記錄項目。每個變更記錄項目都會儲存在 common/changes 下的個別檔案中。您應該將這些檔案新增並提交至 Git。
稍後,Rush 的自動發佈工作流程將檢查這些檔案,以判斷哪些套件需要發佈。它會刪除這些檔案,並將您的訊息複製到套件的 CHANGELOG.md 檔案中。
👉 有關撰寫變更記錄的提示,請參閱撰寫變更記錄。
常見情境
就是這樣!這些是所有常用的 Rush 指令。
結合所有內容,典型的每日例行指令可能如下所示
# Pull the latest changes from Git
git pull
# Install NPM packages as needed
rush update
# Do a clean rebuild of everything
rush rebuild
# Work on one project
cd ./my-project
# Let's assume there is a "start" script in the package.json.
# (To see the available commands, type "rushx" by itself.)
rushx start