全端大師之路 Rush.js - 起手式

閱讀時間約 12 分鐘

寫一個使用 Rushjs 的起手式,包含設定與安裝

什麼是 Rush 呢?

Rush 是一種管理大型存儲庫的工具,尤其適用於處理有多個互相依賴的專案的情況。它是由微軟開發的,並且在開源社區中被廣泛使用。

Rush 的主要功能包括:

  1. 專案之間的依賴關係管理:Rush 可以幫助你管理在同一個存儲庫中的多個專案之間的依賴關係。這包括確保依賴的版本一致,以及在建構或測試時按照依賴的順序來處理專案。
  2. 提供一致的開發環境:Rush 可以確保所有的開發者都在同一個版本的 Node.js 和 package manager(如 npm 或 pnpm)下工作,這可以避免因為環境差異而產生的問題。
  3. 效率:Rush 可以並行地處理多個專案的建構和測試,並且可以只處理那些自從上次成功的建構或測試後有過變更的專案。這可以大幅提升效率,尤其是在大型的存儲庫中。
  4. 策略:Rush 允許你定義更新和發布的策略。例如,你可以設定某些專案在每次變更後都要發布新版本,或者只有在主要變更時才發布新版本。

Rush 是一種專門為了處理大型的、有多個互相依賴的專案的存儲庫而設計的工具,如果你正在處理這種情況,那麼 Rush 可能會對你有所幫助。

全域安裝 Rush

npm install -g @microsoft/rush

進入專案並初始化

cd my-repo //進入專案
rush init //初始化

專案內的檔案

  • rush.json:這是 Rush 的主要設定文件,你可以在這裡設定 Rush 的主要運作方式,例如設定專案的路徑、選擇使用的套件管理工具等。
  • .gitattributes:如果你使用 Git 作為版本控制系統,這個文件可以告訴 Git 哪些文件(例如 shrinkwrap 文件)不應該被合併。如果你不使用 Git,可以刪除這個文件。
  • .gitignore:這個文件告訴 Git 哪些文件或資料夾不應該被追蹤。這通常用於排除像是暫存檔、建置輸出或者敏感資訊等。如果你不使用 Git,可以刪除這個文件。
  • .travis.yml:如果你使用 Travis CI 這個持續整合服務,你可以在這個文件中設定 Travis CI 的運作方式,例如在每次有人對你的專案提出 pull request 時,自動運行 Rush。如果你不使用 Travis CI,可以刪除這個文件。
  • common/config/rush/.npmrc:這個文件讓 Rush 知道你要使用哪個套件源,無論你使用的是 PNPM、NPM 還是 Yarn。
  • common/config/rush/command-line.json:這個文件讓你可以自訂 Rush 的命令行指令或參數,讓你能夠更靈活地使用 Rush。(後面有機會會介紹到,如果沒有斷更了話…)
  • common/config/rush/common-versions.json:這個文件讓你可以指定專案中使用的 NPM 套件的版本,這會影響到 Rush 倉庫中的所有專案。
  • common/config/rush/pnpmfile.js:如果你使用 PNPM,這個文件可以幫助你解決 package.json 中的依賴問題。如果你不使用 PNPM,可以刪除這個文件。
  • common/config/rush/version-policies.json:這個文件讓你可以定義發布的設定,例如版本號的規則等。

補充一點,.gitattributes 和 .gitignore 都是 Git 的設定文件,但是它們的用途和功能是不同的。總的來說,.gitignore 是用來控制哪些文件應該被 Git 追蹤,而 .gitattributes 是用來控制 Git 如何處理追蹤的文件。

    • .gitignore:這個文件的主要用途是告訴 Git 哪些文件或目錄應該被忽略,不應該被追蹤。這通常包括像是編譯產生的二進位文件、日誌文件、個人設定文件或者敏感資訊等。當你在 Git 中新增文件時,.gitignore 中列出的文件或目錄會被自動忽略。
    • .gitattributes:這個文件的主要用途是設定特定的 Git 屬性到你的專案中的文件或目錄上。這些屬性可以影響 Git 如何處理這些文件或目錄。例如,你可以設定某些文件在合併時應該如何處理,或者設定某些文件的行尾字符如何被儲存等。.gitattributes 提供了相當細緻的控制,讓你可以根據需要來調整 Git 的行為。


舉個例子,一個 Node.js 專案中 .gitignore 和 .gitattributes 的範例:

在一個 Node.js 專案中,可能會有以下的 .gitignore 設定:

# 忽略 node_modules 目錄,因為這些都是可以透過 npm install 重新安裝的

node_modules/

# 忽略任何 .env 檔案,因為這些可能包含敏感的環境變數

.env

# 忽略編譯產生的資料夾

dist/

# 忽略 IDE 或編輯器的設定檔

.idea/

.vscode/

*.sublime-project

*.sublime-workspace

# 忽略作業系統生成的檔案

.DS_Store

Thumbs.db

在同一個 Node.js 專案中,可能會有以下的 .gitattributes 設定:

# 確保 Git 輸出的 diff 是人類可讀的

*.diff linguist-vendored

# 將所有的 .js 和 .jsx 檔案視為 LF (換行) 結尾,即使在 Windows 上

*.js eol=lf

*.jsx eol=lf

# 對 minified 的 JavaScript 檔案進行二進位 diff,因為這些檔案的 diff 通常沒有太多的意義

*.min.js diff=binary

在這個例子中,.gitignore 被用來忽略那些不需要加入版本控制的檔案,例如 node_modules、編譯輸出的 dist 目錄、敏感的 .env 檔案、IDE 的設定檔,以及作業系統生成的檔案。而 .gitattributes 則是用來控制 Git 如何處理特定的檔案。例如,它可以確保所有的 JavaScript 檔案都使用 LF 作為行結尾,即使在 Windows 上,也可以對 minified 的 JavaScript 檔案進行二進位 diff,因為這些檔案的 diff 通常沒有太多的意義。

將其他專案加入

筆者的習慣是會先建立兩個資料夾,分別為 librariesapps ,將共用的 packages 放在 libraries 裡,而 web 跟 server 就會放在 apps

raw-image
raw-image


因為加入 rush 後,套件管理工具會改由 rush 跟 pnpm 接手,所以官網建議將舊專案下的相關文件刪除。(注意!不是刪除根目錄的喔)

例如筆者加入了一個 apps/admin-web 的專案

cd apps/admin-web
rm -f shrinkwrap.yaml npm-shrinkwrap.json package-lock.json yarn.lock .npmrc .gitattributes .gitignore
再來很重要的,要去跟目錄下的 rush.json 登記該專案
  "projects": [
{
"packageName": "admin-web",
"projectFolder": "apps/admin-web",
"tags": [
"apps"
]
},
{
"packageName": "pos-web",
"projectFolder": "apps/pos-web",
"tags": [
"apps"
]
},
{
"packageName": "api-server",
"projectFolder": "apps/api-server",
"tags": [
"apps"
]
},
{
"packageName": "@bgm/api-contract",
"projectFolder": "libraries/api-contract",
"tags": [
"packages"
]
},
{
"packageName": "@bgm/api-type",
"projectFolder": "libraries/api-type",
"tags": [
"packages"
]
},
{
"packageName": "@bgm/api-dto",
"projectFolder": "libraries/api-dto",
"tags": [
"packages"
]
}
]
接著下命令,來安裝全部專案的依賴套件(pnpm會用魔法處理幽靈依賴、版本衝突…等等一系列可怕的問題)

rush update

這裡要注意 rush.json 中 packageName 要跟 package.json 中的 name 要一樣,不然會出錯,例如 rush.json 的 packageName 是 admin-web,那 apps/admin-web 的 package.json 中的 name 就要叫 admin-web (看起來像廢話,但筆者在這裡踩過坑...)

補充一個,可以在該專案內的任意位置下 rush update 這個命令,rush cli 會去找每個專案的 package.json 把全部專案的依賴套件都檢查一遍,如果需要安裝才會安裝。
再補充一個,筆者加入的專案是 vue3 ,vite.config.ts 的 server.fs.allow 要設定成 ['../../'] ,可以參考官網(https://vitejs.dev/config/server-options#server-fs-allow)

在 A 專案中將 B 套件引入

這就是用 monorepo 最核心的地方了,這樣要跨專案開發就方便許多,尤其是單人開發有兩種方式:

cd apps/admin-web
rush add --package @bgm/api-contract
 "dependencies": {
...
"@bgm/api-contract": "workspace:*"
...
}
注意改完 package 的內容,要記得 build 才可以在其他 package 裡面引入喔!

可以參考官網(https://rushjs.io/zh-cn/pages/advanced/watch_mode/) 的watch 模式,就不用手動按了喔~

補充一個,如果要下載外部的套件,也可以用以上的方法。

隨筆就先到這裡啦~如果有興趣筆者在整理成一系列文章

參考資料:https://rushjs.io/zh-cn/pages/maintainer/setup_new_repo/https://rushjs.io/zh-cn/pages/maintainer/add_to_repo/https://rushjs.io/zh-cn/pages/developer/modifying_package_json/

沒錯,看著那充滿智慧的眼神,你將會得到從未想過的程式能力、設計能力及最強的通靈能力
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
大家好,我是鱈魚。(^∀^●)ノシ Vue 3.3 終於新增了泛型元件(Generic Component),這讓我們可以在 TypeScript 環境中得到更準確的型別提示。( •̀ ω •́ )✧ 讓我們一起來看看吧!
大家好,我是鱈魚。(。・∀・)ノ゙ 最近看到大家討論取得 API 時機,有許多人都提到「一定要」或者「習慣」,在 onMounted 這個 hook 內呼叫 API 取得資料。 其實這也沒不好,但是也沒什麼好處就是了。(。・ω・。)
pipe 代表函數式程式設計中的概念,利用多個功能結合在一起,資料依序通過每個功能進行處理。文章中介紹了 pipe 的優點、兩個等效的程式碼比較以及 remeda 套件的使用。詳細介紹了使用 pipe 的好處,並提供了多個相關的例子,展示了 pipe 可讀性的提升。
大家好,我是鱈魚。(^∀^●)ノシ Vue 3.3 終於新增了泛型元件(Generic Component),這讓我們可以在 TypeScript 環境中得到更準確的型別提示。( •̀ ω •́ )✧ 讓我們一起來看看吧!
大家好,我是鱈魚。(。・∀・)ノ゙ 最近看到大家討論取得 API 時機,有許多人都提到「一定要」或者「習慣」,在 onMounted 這個 hook 內呼叫 API 取得資料。 其實這也沒不好,但是也沒什麼好處就是了。(。・ω・。)
pipe 代表函數式程式設計中的概念,利用多個功能結合在一起,資料依序通過每個功能進行處理。文章中介紹了 pipe 的優點、兩個等效的程式碼比較以及 remeda 套件的使用。詳細介紹了使用 pipe 的好處,並提供了多個相關的例子,展示了 pipe 可讀性的提升。
你可能也想看
Google News 追蹤
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
前言 現在的前端需求已經越來越高,要考慮HTML及CSS的切版美觀程度,以及React以及Flutter所提出的元件(Componet、widget)觀念,也就是將元件模組化,使元件可以更動態的被程式運行,而不用靜態的客製化每一個介面。開發一個好的元件可以提升整體的開發速度,讓任何使用元件的開發者
Thumbnail
過去一年因為經濟產生的變化,以及疫情開始轉為開放的態度後,就業市場也跟著產生了改變,原本因為疫情而紅起來的遠距辦公,到處都在推廣遠距工作到的好處,到現在台灣的公司開慢慢的鼓勵員工回到辦公室 我們公司最近也開始運行混合辦公模式,一週必須進辦公室兩天,對於年初才因為有遠距工作而搬離台北的我來說,上班突然
Thumbnail
建置好前端後, MERN全端工程師教學在這裡 想學習MongoDB和Express可以來這裡學習
Thumbnail
Onshape教學-基礎3.基本2D繪圖工具Onshape 全雲端3DCAD軟體- 邱允文 在本系列課程中使用 Onshape 學習 CAD 基礎知識。針對初學者,在第一堂課中,我們熟悉 Onshape 及其環境,然後專注於素描工具,然後我們將這些工具付諸實踐,為一個簡單的開瓶器建模。 Onshap
Thumbnail
前幾天看到在靠北工程師 FB 上有篇貼文,原 PO 提到:「因與經理不合,公司唯一一個可以扛下前端、後端、雲端、手機端的工程師,即便老闆加薪 60% 也堅持離職,最後老闆另開一間公司讓這位員工在新公司上班。」後來還上了新聞,一時間被媒體稱為「最強工程師」,真的有工程師能負責這麼多領域嗎?
Thumbnail
最好的投資,就是投資你自己 - 華倫·巴菲特 我覺得先來個總結好了。在上完這一個月的課程後,我推薦如果你是要轉換跑道或是學習網頁開發的朋友們,因為這是一門CP值相當高的一個課程。
Thumbnail
「疫情開始後的一年,數位轉型的趨勢並未減緩,而是加速中,而且這才只是開始。」這是微軟 CEO Satya Nadella 在本季財報公布的開場白,也是微軟對於未來市場的定調。雲端與軟體巨人微軟,2021 第一季交出的成績單,成為了納德拉最強的底氣。
Thumbnail
《發條橘子》作為已故名導史丹利庫柏力克「未來三部曲」最終回,可說是他執導生涯以來,盡情發揮暴力美學挑戰道德底線的大型社會實驗。
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
前言 現在的前端需求已經越來越高,要考慮HTML及CSS的切版美觀程度,以及React以及Flutter所提出的元件(Componet、widget)觀念,也就是將元件模組化,使元件可以更動態的被程式運行,而不用靜態的客製化每一個介面。開發一個好的元件可以提升整體的開發速度,讓任何使用元件的開發者
Thumbnail
過去一年因為經濟產生的變化,以及疫情開始轉為開放的態度後,就業市場也跟著產生了改變,原本因為疫情而紅起來的遠距辦公,到處都在推廣遠距工作到的好處,到現在台灣的公司開慢慢的鼓勵員工回到辦公室 我們公司最近也開始運行混合辦公模式,一週必須進辦公室兩天,對於年初才因為有遠距工作而搬離台北的我來說,上班突然
Thumbnail
建置好前端後, MERN全端工程師教學在這裡 想學習MongoDB和Express可以來這裡學習
Thumbnail
Onshape教學-基礎3.基本2D繪圖工具Onshape 全雲端3DCAD軟體- 邱允文 在本系列課程中使用 Onshape 學習 CAD 基礎知識。針對初學者,在第一堂課中,我們熟悉 Onshape 及其環境,然後專注於素描工具,然後我們將這些工具付諸實踐,為一個簡單的開瓶器建模。 Onshap
Thumbnail
前幾天看到在靠北工程師 FB 上有篇貼文,原 PO 提到:「因與經理不合,公司唯一一個可以扛下前端、後端、雲端、手機端的工程師,即便老闆加薪 60% 也堅持離職,最後老闆另開一間公司讓這位員工在新公司上班。」後來還上了新聞,一時間被媒體稱為「最強工程師」,真的有工程師能負責這麼多領域嗎?
Thumbnail
最好的投資,就是投資你自己 - 華倫·巴菲特 我覺得先來個總結好了。在上完這一個月的課程後,我推薦如果你是要轉換跑道或是學習網頁開發的朋友們,因為這是一門CP值相當高的一個課程。
Thumbnail
「疫情開始後的一年,數位轉型的趨勢並未減緩,而是加速中,而且這才只是開始。」這是微軟 CEO Satya Nadella 在本季財報公布的開場白,也是微軟對於未來市場的定調。雲端與軟體巨人微軟,2021 第一季交出的成績單,成為了納德拉最強的底氣。
Thumbnail
《發條橘子》作為已故名導史丹利庫柏力克「未來三部曲」最終回,可說是他執導生涯以來,盡情發揮暴力美學挑戰道德底線的大型社會實驗。