99精品久久精品一区二区-亚洲熟妇无码?v在线播放-日本国产精品无码字幕在线观看-久久久亚洲永夜AV-亚洲一级无码一区二区一-免费国产成高清人在线视频-中文字幕乱码免费观看-国产毛片精品妇女久久久

ARTICLE DETAIL

資訊詳情

深耕商務(wù)建站與企業(yè)官網(wǎng)運(yùn)營(yíng)的一線實(shí)戰(zhàn)洞察。

Monorepo子包依賴安裝全指南:從提升機(jī)制到幽靈依賴排查

Monorepo子包依賴安裝全指南:從提升機(jī)制到幽靈依賴排查 如果你維護(hù)過(guò)一個(gè)稍大的 Monorepo 倉(cāng)庫(kù)大概率會(huì)遇到這類問(wèn)題在 packages/web 子包里執(zhí)行 npm install xxx裝完卻發(fā)現(xiàn)依賴跑到了根目錄明明其他子包都用了同一個(gè)版本的庫(kù)到了自己這邊就行為不一致更麻煩的是CI 上拉下代碼重新安裝依賴直接報(bào)錯(cuò)說(shuō)缺少某些依賴項(xiàng)。這些問(wèn)題的根源大多集中在一個(gè)地方——子包安裝依賴。這篇文章我打算把 Monorepo 里子包依賴安裝這件事徹底講透包括目錄結(jié)構(gòu)怎么搭、依賴該裝在根還是裝在子包、本地包之間怎么互相引用、報(bào)錯(cuò)時(shí)從哪里開始排查以及一些我踩過(guò)坑之后沉淀下來(lái)的習(xí)慣。適合剛開始用 Monorepo 的團(tuán)隊(duì)也適合已經(jīng)用了 npm/yarn workspace 卻總是被依賴問(wèn)題拖累的同學(xué)。1. 先搞清楚Monorepo 里的“安裝依賴”到底是個(gè)什么場(chǎng)景1.1 一個(gè)倉(cāng)庫(kù)里塞了一堆子包依賴關(guān)系立刻變復(fù)雜Monorepo 本質(zhì)上就是把多個(gè)原本獨(dú)立管理的項(xiàng)目合并到一個(gè) Git 倉(cāng)庫(kù)里統(tǒng)一維護(hù)。這些項(xiàng)目通常叫子包package放在 packages/ 或者 apps/ 目錄下面。每個(gè)子包都有自己的 package.json聲明自己的名字、版本、腳本和依賴。在傳統(tǒng)多倉(cāng)庫(kù)模式下每個(gè)項(xiàng)目獨(dú)立安裝依賴在項(xiàng)目根目錄執(zhí)行 npm install 就能生成 node_modules 和 lockfile流程簡(jiǎn)單新人也能搞定。但到了 Monorepo 場(chǎng)景依賴關(guān)系徹底變了子包 A 依賴子包 BB 又依賴 C根目錄要有所有子包共享的開發(fā)依賴比如 TypeScript、ESLint子包之間還可能有版本范圍交叉A 要求 lodash ^4.17.20B 要求 ^4.17.21兩邊能不能統(tǒng)一用一個(gè)版本這些問(wèn)題已經(jīng)在挑戰(zhàn)傳統(tǒng)的安裝方式了。正因?yàn)檫@種復(fù)雜性Monorepo 的依賴安裝不能再用“進(jìn)入某個(gè)子包目錄執(zhí)行 npm install”這種原始方式你需要一套統(tǒng)一的工作區(qū)機(jī)制來(lái)協(xié)調(diào)。這就是 npm workspaces、yarn workspaces、pnpm workspace 這些概念出現(xiàn)的原因。1.2 npm、yarn、pnpm 三種工作區(qū)機(jī)制對(duì)比目前主流的就是這三種方案底層行為差異很大。維度npm workspacesyarn workspacespnpm workspace需要版本npm 7workspace 協(xié)議建議 8.5Yarn 1.x / Berrypnpm 3符號(hào)鏈接支持支持支持配合硬鏈接默認(rèn)依賴提升是是否嚴(yán)格訪問(wèn)未聲明依賴否否是workspace 協(xié)議部分版本支持支持支持磁盤占用優(yōu)化一般一般明顯多子包集成體驗(yàn)一般好好npm 從 7 開始把 workspaces 作為原生能力配置方式是在根 package.json 里加 workspaces 字段。yarn 1.x 也是類似思路yarn classic 的 workspace 命令是 yarn workspace 包名 add 依賴。pnpm 則在 pnpm-workspace.yaml 里聲明目錄使用 --filter 來(lái)指定子包。這里最本質(zhì)的差異在于是否提升依賴hoisting以及是否容忍幽靈依賴phantom dependencies。npm 和 yarn 默認(rèn)會(huì)把所有子包的依賴提升到根 node_modules方便是方便但很容易出現(xiàn)“我的代碼里明明沒有聲明 lodash卻能用 lodash”的情況。pnpm 默認(rèn)不這么做它會(huì)把依賴安裝到全局 store 中再通過(guò)符號(hào)鏈接放到每個(gè)子包自己的 node_modules 下并且只暴露該子包 package.json 里聲明過(guò)的依賴。1.3 為什么我更推薦 pnpm 作為 Monorepo 的默認(rèn)選擇不是說(shuō)什么場(chǎng)景都必須上 pnpm但如果你接手一個(gè)中大型 Monorepo尤其是前端項(xiàng)目Vue、React 等框架混合我一般建議優(yōu)先考慮 pnpm。三個(gè)原因第一嚴(yán)格的依賴訪問(wèn)控制。pnpm 會(huì)強(qiáng)制你只能使用子包 package.json 里聲明的依賴其他間接依賴即便已經(jīng)存在于 node_modules 中也無(wú)法直接訪問(wèn)。這初看有點(diǎn)煩但能提前暴露大量隱患比等到上線前才發(fā)現(xiàn)某個(gè)包在全倉(cāng)庫(kù)都找不到要好。第二磁盤空間優(yōu)化。多個(gè)子包使用同一版本的依賴時(shí)pnpm 只會(huì)在 store 里存一份并通過(guò)硬鏈接復(fù)用。我在一個(gè)包含 12 個(gè)前端子包的倉(cāng)庫(kù)里實(shí)測(cè)過(guò)用 npm 安裝后 node_modules 約 4.8GB改用 pnpm 后降到了 1.9GB 左右。第三對(duì) workspace 協(xié)議的支持非常成熟filter 參數(shù)能精確控制對(duì)子包的操作適合快速定位單個(gè)子包的依賴問(wèn)題。順帶說(shuō)一句有的團(tuán)隊(duì)因?yàn)闅v史原因必須留在 npm workspaces也不用太擔(dān)心后面幾節(jié)介紹的思路大多通用只是命令換成 npm 對(duì)應(yīng)形式。2. 動(dòng)手實(shí)操在子包中安裝依賴的完整流程2.1 最小 Monorepo 目錄與 package.json 準(zhǔn)備為了把概念落到地上我們建一個(gè)最小 Monorepo。目錄結(jié)構(gòu)大致如下my-monorepo/ ├── package.json ├── pnpm-workspace.yaml ├── packages/ │ ├── utils/ │ │ └── package.json │ └── ui/ │ └── package.json根 package.json 可以很薄只保留腳本和公共開發(fā)依賴{ name: my-monorepo, private: true, scripts: { build: pnpm -r build }, devDependencies: { typescript: ^5.4.0 } }根 package.json 里不建議放業(yè)務(wù)依賴只放那些跟整體構(gòu)建、CI 相關(guān)的工具。業(yè)務(wù)依賴應(yīng)該盡量放到對(duì)應(yīng)子包里否則容易出現(xiàn)“這個(gè)庫(kù)到底是誰(shuí)在用”的歧義。pnpm-workspace.yaml 聲明哪些目錄算子包packages: - packages/*子包 utils 的 package.json 可以這樣寫{ name: my/utils, version: 1.0.0, main: src/index.ts, dependencies: { lodash: ^4.17.21 } }然后在根目錄執(zhí)行pnpm install完成后你會(huì)看到根目錄出現(xiàn) pnpm-lock.yaml以及一個(gè) node_modules 文件夾。pnpm 默認(rèn)會(huì)把符號(hào)鏈接粒度做到子包級(jí)別所以在 packages/utils/node_modules 下能看到 lodash 的符號(hào)鏈接但它的物理文件只存在于全局 store 里。2.2 在子包內(nèi)安裝單個(gè)依賴的正確姿勢(shì)最常見的需求是給某一個(gè)子包單獨(dú)安裝依賴。pnpm 推薦在根目錄使用 filter 指定pnpm add --filter my/ui react這條命令會(huì)修改 packages/ui/package.json并同步更新根 lockfile。npm 對(duì)應(yīng)的是npm install react -w packages/uiyarn classic 對(duì)應(yīng)的是yarn workspace my/ui add react有的人習(xí)慣先 cd 到子包目錄再執(zhí)行 install比如cd packages/ui pnpm add react其實(shí)也可以但我不推薦原因后面第 3.2 節(jié)會(huì)講。在 Monorepo 根目錄統(tǒng)一操作能保證所有子包之間的依賴變化都在同一份 lockfile 里被記錄不會(huì)出現(xiàn)某個(gè)子包目錄下自己生成了一個(gè)獨(dú)立 lockfile 的情況。如果你要安裝的依賴只是本地開發(fā)用的不進(jìn)入發(fā)布產(chǎn)物可以加-Dpnpm add --filter my/ui -D vitest這樣會(huì)寫入 devDependencies。2.3 子包之間互相引用的依賴聲明workspace 協(xié)議Monorepo 里最常用到的功能是子包 A 依賴另一個(gè)子包 B。比如 my/ui 要用 my/utils 提供的工具函數(shù)。第一反應(yīng)可能是這樣寫{ dependencies: { my/utils: ^1.0.0 } }這樣寫有一個(gè)問(wèn)題pnpm 會(huì)先檢查 my/utils 是否存在于本地 workspace 中如果版本匹配會(huì)直接鏈接本地包。理論上可行但不夠明確。更好的方式是使用 workspace 協(xié)議{ dependencies: { my/utils: workspace:* } }workspace:* 的意思是不管版本號(hào)是多少一律使用本地 workspace 中的這個(gè)包。這樣寫的好處是本地開發(fā)時(shí)幾乎不會(huì)出現(xiàn)“明明改過(guò) utils 源碼但 ui 里看到的是 registry 上的舊版本”這種詭異問(wèn)題。如果希望發(fā)布時(shí)能自動(dòng)轉(zhuǎn)換changesets 可以將 workspace:* 改寫為實(shí)際版本號(hào)再發(fā)布到 npm registry。這一點(diǎn)后面 4.2 節(jié)詳細(xì)說(shuō)。pnpm 和 yarn 原生支持 workspace 協(xié)議。npm 的 workspaces 對(duì)這種協(xié)議的兼容涉及版本差異所以如果你在用 npm workspaces建議直接用本地版本號(hào)或者提前確認(rèn) npm 版本對(duì) workspace 協(xié)議的支持情況。2.4 依賴提升機(jī)制為什么 npm 會(huì)偷偷改變你的安裝結(jié)構(gòu)這一節(jié)要解釋依賴提升hoisting它是理解 Monorepo 子包安裝依賴的關(guān)鍵。npm 和 yarn 在安裝時(shí)有一個(gè)默認(rèn)策略能提升到根 node_modules 的盡量提升。比如 packages/ui 依賴 lodashpackages/utils 也依賴 lodash而且版本范圍兼容那 lodash 只會(huì)在根 node_modules 里裝一份兩個(gè)子包通過(guò) Node.js 的模塊查找一路向上找到根目錄都能用。這個(gè)策略的初衷是節(jié)省磁盤和安裝時(shí)間同時(shí)也帶來(lái)一個(gè)副產(chǎn)品幽靈依賴。假設(shè) packages/web 的代碼里 import 了 lodash但 package.json 里并沒有聲明 lodash因?yàn)?lodash 恰好被根 node_modules 下的某個(gè)其他依賴帶過(guò)來(lái)了所以本地運(yùn)行一切正常。這種暗藏的不合法依賴一旦根 node_modules 結(jié)構(gòu)變化比如其他依賴升級(jí)后不再依賴 lodash你的代碼會(huì)瞬間在 CI 或同事電腦上崩掉。pnpm 的選擇不同它把依賴提升關(guān)掉了默認(rèn)采用嚴(yán)格模式。每個(gè)子包的 node_modules 下面只有它聲明過(guò)的依賴符號(hào)鏈接未聲明的依賴在 Node.js 模塊解析時(shí)根本找不到。這個(gè)特性強(qiáng)制開發(fā)者寫清每個(gè)子包的真實(shí)依賴長(zhǎng)期來(lái)看省下的排查時(shí)間遠(yuǎn)比當(dāng)初省掉的幾步命令要多。3. 子包安裝依賴最容易踩的坑與排查方法3.1 幽靈依賴A 子包能用 B 子包沒聲明的庫(kù)第一個(gè)必須說(shuō)透的就是幽靈依賴。我在前端 Monorepo 里見過(guò)太多次這種問(wèn)題。舉一個(gè)真實(shí)場(chǎng)景。倉(cāng)庫(kù)里有 apps/admin 和 apps/site 兩個(gè)應(yīng)用子包還有一個(gè) packages/hooks 子包。hooks 依賴了 dayjsadmin 的代碼里也順手用了 dayjs但 admin 的 package.json 沒有聲明。npm 安裝時(shí)由于 hoistingdayjs 被提升到根 node_modulesadmin 自然也能引用一切正常。過(guò)了兩個(gè)月hooks 升級(jí)時(shí)移除了 dayjs 依賴或者安裝順序變化導(dǎo)致 dayjs 不再出現(xiàn)在根 node_modulesadmin 立刻崩了報(bào)錯(cuò)通常是 Cannot find module dayjs。排查時(shí)先別著急猜用幾個(gè)命令定位pnpm why dayjs這條命令會(huì)列出 dayjs 依賴關(guān)系鏈告訴你哪些子包聲明了它、哪些是間接依賴。如果發(fā)現(xiàn)某個(gè)子包在代碼里用了它但 dependencies 里沒寫那就是幽靈依賴。如果是 npm 環(huán)境可以用npm ls dayjs它會(huì)給出依賴樹但因?yàn)樘嵘龣C(jī)制可能顯示在根 node_modules 下你還要人工判斷誰(shuí)真正聲明了它。更隱蔽的是版本間不一致A 子包依賴 dayjs 1.xB 子包依賴 dayjs 2.x如果兩個(gè)子包互相依賴鎖文件就會(huì)同時(shí)鎖定兩個(gè)版本。解決思路要么升級(jí)統(tǒng)一到一個(gè)大版本要么用別名。3.2 安裝到根還是安裝到子包位置不對(duì)引發(fā)的怪問(wèn)題很多人容易犯的一個(gè)錯(cuò)誤是在子包目錄里執(zhí)行新的依賴安裝。假設(shè)你當(dāng)前在 packages/ui 目錄下直接跑pnpm add axiospnpm 會(huì)檢測(cè)這里的 workspace 根節(jié)點(diǎn)把 axios 安裝到 packages/ui/package.json這通常沒問(wèn)題。但 npm 的行為就復(fù)雜一些如果你在 packages/ui 目錄下跑 npm install axios有的 npm 版本會(huì)把依賴寫進(jìn)子包有的則會(huì)在子包目錄生成一個(gè)獨(dú)立的 package-lock.json從而破壞根目錄的 lockfile 一致性。我建議的統(tǒng)一習(xí)慣是所有依賴安裝都在倉(cāng)庫(kù)根目錄執(zhí)行并用 filter 或 workspace 參數(shù)指定目標(biāo)。這樣不管哪個(gè)團(tuán)隊(duì)成員執(zhí)行命令結(jié)果都是可預(yù)測(cè)的。還有一類情況想把某個(gè)只用于構(gòu)建的工具裝到根。比如你想統(tǒng)一裝一個(gè) prettier 給所有子包用可以用pnpm add -w -D prettier-w 是 --workspace-root 的簡(jiǎn)寫表示安裝到根目錄。寫在根目錄的依賴所有子包運(yùn)行時(shí)都能通過(guò) Node 模塊解析找到這本身沒問(wèn)題但要注意的是這會(huì)在子包之間形成隱性依賴。比如 ui 子包里的 prettier 相關(guān)腳本其實(shí)依賴的是根目錄的 prettier一旦團(tuán)隊(duì)有人把 root 當(dāng)成雜貨間后面很容易亂。3.3 “缺少依賴項(xiàng)”類報(bào)錯(cuò)的通用排查思路很多人在安裝依賴時(shí)會(huì)碰到類似“由于缺少一些依賴項(xiàng)無(wú)法安裝產(chǎn)品”這樣比較模糊的報(bào)錯(cuò)。出現(xiàn)這種報(bào)錯(cuò)時(shí)第一反應(yīng)不應(yīng)該是懷疑 Monorepo而是排查環(huán)境。這類問(wèn)題在 Monorepo 環(huán)境中高發(fā)原因在于子包數(shù)量多原生模塊、編譯工具鏈穿插其中。比如某個(gè)子包依賴了 node-sass 或 sqlite3 這類需要原生編譯的包安裝時(shí)就需要系統(tǒng)里有 Python、C 編譯工具鏈、對(duì)應(yīng)操作系統(tǒng)版本的 SDK。我在 Windows 和 Linux 上都遇到過(guò)類似問(wèn)題報(bào)錯(cuò)信息里甚至?xí)小罢?qǐng)確保已安裝這些驅(qū)動(dòng)程序”之類的提示雖然字面上說(shuō)的是驅(qū)動(dòng)實(shí)際上往往是系統(tǒng)缺了某個(gè)運(yùn)行庫(kù)或編譯環(huán)境。如果你在 Monorepo 里遇到這類安裝失敗按順序排查先看報(bào)錯(cuò)全文重點(diǎn)看 Failed 或 Error 后面的完整路徑確認(rèn)是哪一層子包、哪個(gè)依賴導(dǎo)致的中斷。檢查系統(tǒng)環(huán)境比如 Python 是否在 PATH 中node-gyp 要求的版本是否滿足編譯器是否具備。確認(rèn)網(wǎng)絡(luò)環(huán)境registry 是否能訪問(wèn)到對(duì)應(yīng)依賴的下載地址。如果是 Windows還需要注意符號(hào)鏈接相關(guān)權(quán)限pnpm 要求開啟開發(fā)者模式或使用管理員運(yùn)行的終端。有些項(xiàng)目還要求在指定 Python 路徑下做環(huán)境配置。比如某些量化平臺(tái) QMT、AI 工具鏈 ComfyUI 安裝依賴時(shí)都會(huì)要求你先把環(huán)境切到特定 Python 解釋器再安裝否則會(huì)裝到別的環(huán)境里去。Monorepo 里也有類似場(chǎng)景你可能會(huì)同時(shí)維護(hù)多個(gè)運(yùn)行環(huán)境不同的子包有的是 Node 應(yīng)用有的是 Python 腳本。這種跨語(yǔ)言 Monorepo 的依賴安裝方案一般不建議只靠 npm/pnpm 一把梭而是讓不同語(yǔ)言各自管理依賴再用根目錄腳本統(tǒng)一串聯(lián)。3.4 lockfile 沖突與版本漂移的實(shí)戰(zhàn)處理多人協(xié)作的 Monorepo最讓人頭疼的就是根目錄 lockfile 的沖突以及由此引發(fā)的版本漂移。假設(shè)倉(cāng)庫(kù)用的是 pnpm。根目錄 pnpm-lock.yaml 記錄所有子包的完整依賴樹任何子包改動(dòng)依賴都會(huì)導(dǎo)致 lockfile 變化。當(dāng)兩個(gè)分支同時(shí)新增依賴合并時(shí) lockfile 大概率沖突。處理方式有幾種養(yǎng)成“依賴變更獨(dú)立提交”的習(xí)慣盡量少把依賴升級(jí)和功能開發(fā)混在同一個(gè) PR 里。出現(xiàn)沖突時(shí)不要急著手工改 lockfile先在其中一個(gè)分支上重新生成pnpm install --lockfile-only再提交。CI 上強(qiáng)制使用pnpm install --frozen-lockfile發(fā)現(xiàn) lockfile 與 package.json 不一致時(shí)直接失敗這樣能防止有人把失敗狀態(tài)的 lockfile 合進(jìn)主分支。版本漂移是另一種坑。子包 A 用lodash: ^4.17.20子包 B 用lodash: ^4.17.21正常情況下 pnpm 會(huì)嘗試解析到一個(gè)符合所有范圍的版本并安裝在 store 和對(duì)應(yīng)位置。但如果兩個(gè)范圍互不兼容pnpm 會(huì)各自安裝導(dǎo)致同一份代碼在不同子包中的行為不同。這種問(wèn)題在開發(fā)時(shí)很難察覺直到你發(fā)現(xiàn)一個(gè)子包修好的 bug 在另一個(gè)子包復(fù)現(xiàn)。要想統(tǒng)一跨子包依賴版本可以用 syncpack。它能夠掃描所有子包的 package.json檢查相同的依賴是否用了不同的版本范圍還能一鍵把范圍內(nèi)的版本統(tǒng)一成指定值。3.5 網(wǎng)絡(luò)與緩存問(wèn)題換個(gè)環(huán)境就裝不上依賴Monorepo 的子包數(shù)量一多依賴下載量會(huì)非常大網(wǎng)絡(luò)和緩存問(wèn)題也隨之放大。最常見的現(xiàn)象是本地裝得很好推到 CI 或者換一臺(tái)機(jī)器就失敗。這種問(wèn)題一般有三個(gè)方向registry 不穩(wěn)定。國(guó)內(nèi)環(huán)境經(jīng)常需要配置鏡像pnpm 可以通過(guò) .npmrc 配置 registry例如registryhttps://registry.npmmirror.com。注意 .npmrc 的位置根目錄配置會(huì)影響所有子包。store 不一致。pnpm 的全局 store 如果在不同機(jī)器上內(nèi)容不同會(huì)導(dǎo)致安裝時(shí)重新下載??梢栽?CI 中緩存 store 目錄減少網(wǎng)絡(luò)請(qǐng)求。離線包問(wèn)題。有時(shí)你把依賴下載到本地希望用離線文件安裝。pnpm 有對(duì)應(yīng)命令比如通過(guò)pnpm store add先把某個(gè)包放入 store再離線安裝。這與你在 ComfyUI 這類工具中手動(dòng)指定本地依賴文件是相似的思路——關(guān)鍵是要搞清工具讀取的目錄和解析方式避免“我明明下載了但沒生效”的錯(cuò)覺。如果遇到“明明換了一臺(tái)機(jī)器就成功這臺(tái)機(jī)器總是失敗”的情況優(yōu)先測(cè)試網(wǎng)絡(luò)和全局緩存目錄權(quán)限不要一上來(lái)就改代碼。4. 把子包依賴裝穩(wěn)的進(jìn)階實(shí)踐4.1 用同一份 lockfile 約束所有子包的依賴Monorepo 的優(yōu)勢(shì)之一是根目錄只有一份 lockfile可以讓所有子包在同一個(gè)依賴快照下運(yùn)行。這樣在 CI 上構(gòu)建時(shí)無(wú)論構(gòu)建哪個(gè)子包使用的依賴版本都一致可復(fù)現(xiàn)性會(huì)好很多。但前提是你得保證不會(huì)產(chǎn)生多余 lockfile。你需要檢查倉(cāng)庫(kù)里是否存在 packages/*/package-lock.json 這類文件。一旦出現(xiàn)說(shuō)明有人在子包目錄單獨(dú)執(zhí)行過(guò) install。發(fā)現(xiàn)后應(yīng)刪除并在根目錄重新執(zhí)行安裝。為了防止再次發(fā)生可以在 CI 里加一道檢查掃描多余 lockfile 文件。在依賴鎖定的基礎(chǔ)上使用--frozen-lockfile是必要的。比如 pnpm 中pnpm install --frozen-lockfile如果 package.json 與 lockfile 不完全匹配命令會(huì)直接報(bào)錯(cuò)而不是幫你悄悄更新 lockfile。這樣能確保 CI 環(huán)境與提交的 lockfile 完全一致。npm 對(duì)應(yīng)參數(shù)是npm ciyarn classic 是yarn install --frozen-lockfile。4.2 結(jié)合 changesets 管理發(fā)布讓依賴變更可追溯子包安裝依賴只是第一步最終是要讓子包發(fā)布上線。在 Monorepo 里發(fā)布一個(gè)包時(shí)它依賴的本地 workspace 包如果也改了就必須一起發(fā)布新版本并更新依賴范圍。changesets 是目前最成熟的方案之一。它不直接管理依賴版本而是在倉(cāng)庫(kù)中記錄 changeset 文件描述哪些子包做了哪些改動(dòng)、版本是 minor 還是 major最后通過(guò) CI 合并成 changelog 和版本變更。使用流程大概是這樣pnpm add -w -D changesets/cli pnpm changeset init pnpm changeset每次改動(dòng)后在根目錄執(zhí)行 pnpm changeset 會(huì)交互式問(wèn)你哪個(gè)子包改了、版本級(jí)別是什么是否作為某個(gè)依賴的配套變更。提交后之后在 CI 執(zhí)行pnpm changeset version pnpm changeset publishchangesets 會(huì)自動(dòng)把子包里的workspace:*依賴改寫成實(shí)際發(fā)布的版本號(hào)然后發(fā)布到 registry。這樣做的好處是依賴變更可以追溯到一次 PR而不是散落在多個(gè)提交里。4.3 在 CI 里安裝子包依賴的高效姿勢(shì)CI 環(huán)境與本地有很大差異最大的問(wèn)題是每次都是全新環(huán)境依賴安裝時(shí)間可能長(zhǎng)達(dá)十幾分鐘。優(yōu)化思路有幾個(gè)第一合理緩存 store。pnpm 的全局 store 可以做持久化緩存比如在 GitHub Actions 中緩存~/.local/share/pnpm/storeWindows 路徑會(huì)不同可以大幅減少二次安裝時(shí)間。第二使用 frozen lockfile。前面提過(guò)這里再次強(qiáng)調(diào)CI 里絕不能允許依賴悄悄變更。第三按需安裝。雖然 Monorepo 統(tǒng)一安裝所有子包比較省心但如果你只需要構(gòu)建其中一個(gè)子包可以用 pnpm 的 filter 縮小范圍pnpm install --filter my/ui...注意后面是三個(gè)點(diǎn)表示同時(shí)安裝該子包及其依賴的 workspace 子包。第四不要把日志污染到失控。子包多時(shí)安裝日志會(huì)非常長(zhǎng)建議開啟--reporterappend-only或類似配置讓 CI 日志只顯示關(guān)鍵步驟。4.4 一些值得長(zhǎng)期堅(jiān)持的目錄設(shè)計(jì)原則最后聊一聊長(zhǎng)期維護(hù) Monorepo 時(shí)的幾個(gè)原則它們?cè)谠搭^減少依賴安裝問(wèn)題。一是盡量使用 scope 規(guī)范子包命名形如 your-org/package-name。scope 能精準(zhǔn)指定子包避免出現(xiàn) ui、utils 這樣容易沖突的名字。二是控制子包規(guī)模。子包越多依賴關(guān)系越復(fù)雜安裝和編排成本也越高。如果一個(gè)子包只有幾行代碼不如考慮合并到其他包中。三是依賴關(guān)系圖盡量保持有向無(wú)環(huán)。子包之間的依賴不要形成環(huán)否則發(fā)布和安裝都會(huì)變得很難受??梢杂?madge 之類的工具在 CI 中檢查依賴關(guān)系防止循環(huán)依賴。四是謹(jǐn)慎使用 peerDependencies。Monorepo 中跨子包傳遞 peer 依賴經(jīng)常引發(fā)版本匹配問(wèn)題尤其在 Vue/React 組件庫(kù)場(chǎng)景中peer 依賴范圍寫得太緊會(huì)導(dǎo)致安裝失敗寫得太松又可能讓使用者拿到不兼容版本。在能明確統(tǒng)一的情況下直接使用 dependencies 反而更省心。5. 我的幾個(gè)依賴管理習(xí)慣說(shuō)到底Monorepo 子包安裝依賴的核心不是在命令層面記住一堆參數(shù)而是理解依賴的本質(zhì)節(jié)點(diǎn)之間如何解析、提升和鏈接以及如何用統(tǒng)一鎖文件約束版本。單倉(cāng)庫(kù)時(shí)代我們只需要關(guān)心 npm install 做了什么到了 Monorepo你需要額外關(guān)心的是“哪一個(gè)包”和“在哪一層”。我這里給出一個(gè)最實(shí)用的建議無(wú)論你最終選 npm、yarn 還是 pnpm都請(qǐng)?jiān)诟夸浗y(tǒng)一操作用 filter 或 workspace 命令指定子包如果遇到依賴安裝報(bào)錯(cuò)先看環(huán)境再改代碼盡量把 lockfile 當(dāng)成代碼來(lái)維護(hù)該 review 就 review。我在實(shí)際維護(hù) Monorepo 的過(guò)程中深有體會(huì)依賴裝錯(cuò)位置的坑遠(yuǎn)遠(yuǎn)少于依賴清理不及時(shí)的坑?,F(xiàn)在我維護(hù)新倉(cāng)庫(kù)時(shí)會(huì)把“能否用 pnpm 嚴(yán)格鏈接”作為默認(rèn)驗(yàn)收項(xiàng)如果團(tuán)隊(duì)不想換工具那至少也要保證根 lockfile 始終存在于版本庫(kù)且 CI 里開啟 frozen 校驗(yàn)。一套流程順下來(lái)再回頭看那些“莫名其妙裝不上”的問(wèn)題大概率都是環(huán)境或約定層面可以提前規(guī)避的。最后再分享一個(gè)小技巧如果你發(fā)現(xiàn)自己經(jīng)常在 Monorepo 里依賴某個(gè)包時(shí)來(lái)回踩坑先在根目錄跑一次pnpm why和pnpm outdated看清楚依賴來(lái)源和版本狀態(tài)再?zèng)Q定是升級(jí)還是固定版本。比起盲目刪 node_modules 重裝這種排查方式要精準(zhǔn)得多。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
国产黄色在线| 天天色天天爱天天舔| 黄网在线播放| 激情小说婷婷五月| 99国产小视频2013| 婷婷五月天综合AV| 午夜成人av在线| 日韩操逼大片| 九九99久久| 丁香六月综合激情| AAA久久久AAA久久久AAA| 色色综合网站| 97五月天| 深爱婷婷丁香五月激情| 六月婷婷日| 一二区成人电影| 六月婷婷综合| 丁香五月激情综合| 婷婷五月丁香超碰| 综合网五月| 国产欧美日韩综合精品一区二区| 天天日天天色| 狠狠操狠狠做| 欧爱综合视频| 在线五月色播| 电影爱拉战争免费观看| 色婷婷黄色网络| 九热av| 丁香六月啪啪| 激情综合在线观看| 色5月婷婷色| 欧美va亚洲va在线播放| 99热视| 啪啪综合| 色碰干| 色欲久久99精品久久久久久| av一级棒av| 色一情一乱一乱一区91Av| 六月丁AV| 五月天久久丁香| 影音先锋xfplay资源男人网| 色五月婷婷色| 超碰人妻在线| 久热九九| 久久六月综合| 夜夜撸夜夜骑| 日本99视频| 婷婷丁香五月综合| 久草a片| 丁香五月亚洲| AV性爱在线| 五月丁香激情深爱婷婷| 亚州性爱99| 天天草婷婷五月| 色五月天丁香| 九九热99re8热免费观看| 91丨九色丨熟女|新版| 免费超碰在线| 操逼视频一区| 五月婷婷久久综合| 五月婷婷六月丁香激情深爱| 五月色婷婷综合丁香精品无遮挡| 五月天婷爱综合| 婷婷免费精品视频| 丁香花五月天| 97操在线资源| 欧美色色日韩| 五月丁香六月激情综合| 天天肏夜夜肏| 同性gv国产精品一区二区| 97色色色色| 97九色| 大香蕉免费9| www.五月婷| 国产欧美日韩综合精品一区二区| www.99热国产| 九月丁香八月婷婷加勒比| 国产又色又爽又黄又免费| BBWCUCKOLD精品熟妇| 大地9中文在线观看免费高清| 337p大胆噜噜噜噜噜91Av| 久久97| www五月| 超碰99在线| 狠狠 婷婷| 夜夜操夜夜爽| 可以免费看的av网站| 天天综合天天玩夜夜玩天天玩夜夜玩| 亚洲天堂aaa| 久久久这里有精品| 五月婷婷婷婷| 91精选国| 亲子乱AV一区二区三区下载| 思思久久99热| 播五月丁香六月| 色J香五月天| 99热在线看| 中文字幕AV在线播放| 97人人操人人爽| 久久a热| 色色婷婷五月| 91av无码| 天天天久久久| 91婷婷五月天嫩女| 九月婷婷综合八月丁香在线观看| 伊人狠狠综合| 丁香五月婷婷亚洲综合精品| 久九男女天堂| 色5月婷婷色| 丁香亭亭久久| 久久综合人妻| 精品亚洲国产成AV人片传媒| 久久久五月天网站| 97涩涩丁香五月天| 久久性视频| 午夜天堂一区人妻| 色婷婷狠| 情婷婷五月天| 婷婷五月色| 激情玖玖综合网| 成年人夜夜喷水| 激情综合网,婷婷| 日韩AV大全| 九热视频| 欧美色色色色色色色| 日91高清无玛| 丁香五月婷婷激情97| 色色色色色色色色色色色色色97| 96性爱视频| 天天插天天插天天插天天插| 午夜天堂一区人妻| 99操久久| 六月婷婷八月丁香| 国产91在线视频| 性韩日色婷婷五月天激情啪啪XXX| 丁香网五月网| 天天做天天爱天天高潮| 另类A片| 欧美色小说婷婷| 99色网站| 九月丁香八月婷婷久久综合久97| 国产一区男女| 99这里有精品| 99色视频| 婷婷丁香五另类网站| 久久全意婷婷| 深爱激情九九五月天 | 99在线观看亚洲| 亚洲成人婷婷| 91久久久久| 另类图片天天影视在线观看| 国产综合婷婷| 激情五月天视频| 97色在线| www.99热| 91狠狠综合久久久久久| 超级碰碰91| 激情亚洲婷婷六月| 人人爱国产| 色 噜噜 九月 婷婷| 一夜福利不卡| 五月婷婷色播| 夜色综合网| 热99AV网站| 久99| 狠狠五月激情在线| 欧美在线视频99| 中日韩狠狠色| www.婷婷,com| 狠狠爱五月婷婷| 婷婷五月天成人网站| 99热精品在线在线| 婷久看人爽| 日本色色图| 三级99热| 成人五月天丁香婷| 色综合区| www.婷婷五月| 99爱在线| 91精品久久久久久久久久| 思思热闹这里只有精品| 99精品在线| 欧美极品999| 婷婷五月综合网| 欧美日本99| 伊人网色婷婷五月天| 99视频| 狠狠夜夜五月丁香| 97精品人人A片免费看| 日韩一66精品| 色综合久久久无码中文字幕999| 这里只有精品热| 大香蕉久| 五月婷综合性中心| 久久美女五月天| 91大操| 五月天久久www| 亚洲精品色| 深爱女色婷婷丁香五月亚洲图区| 91人妻色色网| 婷婷五月情| 九九综合| 国产乱人偷精品人妻A片| 六月婷婷六月天天在线免费| 亚洲视频在线网站| 深爱激情五月天| 色综合视频| 久久婷婷五月综合啪| 操久久精| 五月婷婷激情网| 99ri视频| 婷婷六月丁香五月图区| 天天舔天天摸| va中文资源在线观看| 成人视频网| 五月婷婷免费在线观看| 丁香六月婷婷开心婷婷网| 五月激情婷婷播播开心| 五月丁香六月婷婷亚洲天堂网站| 免费看成人AA片无码视频吃奶| 六月色国内综合| 草久私拍| 久久五月天婷婷| 六月婷婷日| 久久婷婷色综合老司机| 99热这里只有精品2| 色五月xxx| 丁香五月婷中字在线| 激情www| 99热在线资源| 牛牛热这里只有jingpin| 婷婷五月天综合小说网| 精品久久99| 色婷婷成人做爰A片免费看网站| 久久这里有精品99| 色欲天天综合| 大香蕉婷婷婷| 激情五月天综合网| 日韩aaaaa| 九九这里只有精品在线视频| 99免费青青蜜臀| 在线日韩视频| 99热这里只有精品86| 六月婷色| 色婷婷很很丝袜| 婷婷情色五月天| 99re久热只有精品6在线直播| 亚洲在线网站| 五月天色图| dingxiangtingtingliuyue| 久久久久久久久久久44| 婷婷色情 | 噜噜狠狠色综合久| 日日操,夜夜爽| 久久婷婷五月天激情四射| 国产亚洲精品AAAAAAA片| 丁香五月天AV| 丁香五月婷婷成人网| 9l视频自拍九色9l视频在线观看| 丁香六月婷婷激情| 深爱激情五月天| 午夜婷婷久久 | 99无码| 开心五月深爱五月婷| 精典久久| 五月激情射| 国产欧美精品AAAAAA片| 99免费| 六月婷婷久久| 婷婷六月天亚州| 天天做天天爱高潮片| 狠狠干狠狠操狠狠爱| 99精品在线观看| 九九热精品视频在线观看| 婷婷深爱色五月| 午夜成人网站在线观看| 少妇婷婷五月天| 粉嫩AV久久一区二区三区| WWW.婷婷五月天.COM| 婷婷五月天激情五月天网站| 婷婷丁香69精华| 久久sp免费视频| 色五月激情五月| 丁香五月成人社区| 久久伊人婷婷| 婷婷丁香九月| 色综合久久综合中文综合网| 伊人久久大香线蕉av最新| 99热国产免费| 99ri视频在线播放| 丁香六月婷婷久久亚洲天堂| 久久久9久| 国产99久久久国产精品免费看 | 人人爽天天莫| 九九九这里只有精品| 97色女人在线| 97精品在线| 9在线9在线婷婷在线国产| 成人.在线日韩| 99精品网| 狠狠综合网| 99色热| 色综合久| 成人在线视频网| 这里只有精品视频99| 99色在线观看视频| 91超级碰| AAA久久| 操一区| 99色综合网| 九九99在线视频| 91久久九| 91人人超碰在线| 欧美日韩中国| 噜噜操操| 狠狠色丁香五月婷巨| 这里只有精品免费在线视频| 99在线观看精彩视频| 思思色播| 丰满人妻一区三区三区| 婷婷亚洲欧美丁香五月| 久久久天天啊| 日本99久久| 97人人射| 欧美性生交XXXXX无码小说| 婷婷色综合| 色五月婷婷在线| 男妓跪趴把舌头伸进我的嘴巴| 亚洲精品久久久久AV无码| 亚洲第一成人无码A片| 99精品视频免费观看近期发布| 国产全是老熟女太爽了| 国产亚洲99久久精品熟女| 久久3级片| 吾爱AV导航| 久久综合干| 久操热线| 免看黄大片AA | 五月丁香婷婷欧美色图视频五月丁香777电影 | 99色网站| 99在线资源视频| 丁香五月婷婷亚洲天堂| 啪啪色激情五月天| 99色最新在线视频网站| 另类激情综合| 亚洲九九夜夜| 玖色色综合| 色色色婷婷五月天| 先锋av性爱成人电影| 婷婷射丁香| 大香蕉网站,大香蕉综合| 99∨VTV| 婷婷激情五月呦呦| 秋霞成人毛片一级A片| 国产色色在线| 国产精品人人妻人人爽| 日本狠狠干| 久久五月天影院| 伊人婷婷五月天av| 狠狠色激情在线| 五月开心深爱激情网| 亚洲精品成人| 欧美97超碰| 久久五月网| 69婷婷丁香午夜| 青草五月天| 久久综合激情| 激情宗合 激情宗合| 这里都是精品99| 天天日日爽| 九色自拍| 日本9区视频| 色五月天.con| 色婷婷婷婷| 丁香五月天堂网| 国产AV网页| 天天插天天插天天操| 久久A区B区| 五月婷丁香| 天堂网亚洲色图| 久久久人妻久久久| 伊人玖玖婷婷| 亚洲综合五月天婷婷丁香| 性爱网六月丁香| 亚洲综合丁香五月| 玖玖婷婷五月天| 91综合色噜噜| 国产精品激情五月天色婷婷| 久久99网站| 艹天天射| 五月婷婷六月少妇激情| 亚洲视频一区| 99re熱| 看片视频在线免费日产在线看| 99色色网| 国产欧美日韩性爱| 综合色色网| 色色五月综合| 久久机热思思热| 五月综合激情网| 国产成人AV在线播放| 欧洲亚洲免费视频区| w婷婷五月婷婷w| 五月婷无码| 婷婷五日b| 色热久资源| 97碰碰视频| 国内熟女黄色系列| 亚洲六月婷| 香蕉综合在线| 手机在线日韩视频中文字幕| 天天综合五月天| 丁香深五月婷婷| 五月婷婷综合激情| 亚洲第一综合| 狠狠操天天操天天操| 99高级会所久久| 日韩啪啪视频| 91九色国产| www.久久99热地址发布| 91九色大屁股| 五月天婷婷伊人| 在线综合91| 99视频只有这里精品| 最近免费中文字幕大全高清大全1| 九九热a| 婷婷丁香五月亚洲| 性色播| 色一情一乱一乱一区91Av| 五月色丁香| 国产激情在线| 婷婷久久久| 99在线精品观看99| 99爱在线| 激情五月天婷婷播播久久综合91| 性天天中文网| 在线伦子99热| 99自拍视频网站| 婷婷色九月| 伊人色五月| 类似婷婷激情综合网站| 婷婷久久亚洲| 婷婷五月综合激情| 最新亚洲色色网| 婷色影院| 噜噜视频| 久操热线| 国产av天堂| 激情的五月| 精品爱欲五| 夜夜骑福利资源| 亚洲国产网址| 久久婷婷91| 欧洲亚洲免费视频9| 五月色婷| 五月丁香婷中文字幕| 极骚大香蕉伊人| 99乱视频| 日日干五月天婷婷| 秋霞AV吧| 伊人色综合久久久| 97成人丁香婷婷| 日韩免费视频| 99成人无码| 久久99久久久久久久噜噜| 婷婷五月激情欧美| 婷婷六月网| 丁香五月婷婷综合激情啪啪啪| 日狠狠| 亚洲高清在线| 日B日潘金莲BB| 五月婷婷我| 秋霞日本免费毛片A片| 色色色色色色色色综合网| 五月天婷婷爱丁香中文字幕| 在线超碰91| 99只有精品| www,婷婷五月天777me,com| 人五月天婷婷喷水| 色情综合| 极品五月天| 九九干视频| 日日夜夜干| 色狠狠色综合| 大香蕉久久| 丁香五月天AV在线 | 中美日韩成人在线| 五月天婷久久| 婷婷丁香五另类网站| 99热这里只有精品国产免费| 色玖玖玖| 在热视频精品| 久操婷婷| 色色色色色综合| 亚洲天堂久久| 色欲影香| 亚洲激情精品| 99色这里| 亚洲激情综| 国产一级片色色| www.色9| 伊人婷婷色激情丁香| 五月丁香婷草| www.韩日视频| 激情婷婷| 欧美99热| 六月婷婷视频| 99热中文字幕久久| 五月婷婷co.m| 九九熱最新視頻| 1024操逼| 久热99| 色色五月天丁香婷婷| 色婷婷色久综| 老司机午夜福利视频金瓶梅| 九九综合伊人| 九九人人自拍| 婷婷五月a| 超碰日韩成人| 香蕉AV福利精品导航| 啊V视频在线观看| 丁香五月天激情免费在线观看AV777| 五月丁香少妇网| 国产成人AV在线| 日本人人草草| 91丨九色熟女丨首页| 日韩在线看AV| 无码AV久久久久久久久| 国产成人+综合亚洲+天堂| 色色色综合| 天天日天天日天天搞| 丁香六月婷月91婷月| 日本不卡中文字幕| 亚欧州精品视频| 亚洲激情六月丁香| 激情婷婷激情在线不卡| 久久久久久久久久久-久五月天婷婷| 欧美精品18| 婷婷射图| 日本超碰在线| 久婷五月| 丁香五月在线人妻| 色婷婷狠狠18禁| 婷婷五月丁香综合激情| 91在线日本| 色婷婷亚洲综合av| 久久六月综合| 人妻五月天激情开心网| 精品九九网| 日韩美女在线视频19| 超碰人人妻| 亚洲第一成人AV| 六月五月天婷婷涩播在线| 极品人妻VIDEOSSS人妻| 国产精品天天狠天天看| 九月婷婷在线视频| 丁香五月婷婷综合激情啪啪啪啪啪啪啪 | 日日噜噜夜夜狠狠久久丁香五月| 天天射影院| 激情五月婷婷五月丁香五月开心五月| 婷婷在线激情| 久久久香| 欧美精品999| 99热在线播放| 色婷婷丁香女女| 五月婷婷久久网| 日韩aⅴ视频| www99热| 九九婷婷网五月天| 色情丁香五月婷婷精品| 99re思思热久久| 香蕉婷婷| 久久视9精| 97色一二三| 99资源在线| 六月婷婷色色色| 婷婷激情综合色五月久久图片| 欧美超碰人人| 日本久久99| 六月丁香啪| 婷婷亚洲在线| 99色 | 丁香五月婷婷综合视频| 天天射影视综合网| 色五月婷婷九月| 91干| 国产人妻777人伦精品HD| 五月天操逼激情| 日韩AV在线免费| 丁香五月天.com| 天天玩夜夜操天天爽| 国产淫熟妇| 丁香六月欧美| 色香欲综合| 综合色、色综合| 精品久热69| Av大香蕉| 99热99精品在线观看| 久久久久久久8| 91人操| 天天干狠狠操| 婷婷五月天网| 这里只有精品视频| 狠狠草网| 色婷婷4| 丁香五月综合在线观看| 五月天综合婷婷| 国产婷婷婷| 任你日视频| 天天模,夜夜模夜夜爽| 五月天天天天天天天天天天天婷婷婷| 婷婷五月丁香五月| 婷婷婷久久久| 26UUU精品一区二区Com| 大香蕉综合| 婷婷激情久久| 超碰在线人妻| 97色色色色色| 亚洲激情在线| 超碰二区| A久网| 天天日天天爽夜夜爽| wwwav大香蕉| 九色婷婷| 久久色午夜在线导航| 丁香五月天激情网址| 欧美丁香五月| 大香蕉啪啪网| 久久婷狠狠色| 五月激情婷婷丁香| 这里只有精品96| 99操碰| 亚洲精品永久久久久久| 色狠狠婷婷| 99色区| 激情av在线| 潘金莲AAAAAAAAAA| 99在线观看视频精品| 超碰日日操| 97色综合| 欧爱综合视频| 久久五月天婷婷| 91丨九色丨白浆秘| 色屌丝中文字幕| AⅤ网站在线看| 色婷婷五月天激情| 色九网| 秋霞丝袜啪啪啪| 婷婷五月天亚洲精品| 思思热在线观看| 九九热99视频在线| 99热成人| 9999热精品| 在线播放 精品| 久久久精品99亚洲综合| www.99婷婷| 一操久久| 五月天狠狠网| 色开心五月婷婷丁香HD| 婷婷色成人| 国产精品日本一区二区在线播放| 开心深爱五月天| 色色五月天激情| 婷婷九月亚洲| 五月丁香婷婷色色色| 婷婷色一二三区波多野结衣| 思思国产99| 影音先锋男人av资源站| 婷婷综合五月色播| 久久五月天激情| 五月天色导航| 婷婷五月天国产传媒| 六月丁香深深爱| 成人做爰A片免费看视频| 亚洲精品乱码久久久久久按摩观| 九九热视频99| 丁香五月婷婷激情网| 久操大| 色五月激情网| 大香蕉五月天婷婷| 色婷婷精品小视频| 国产熟妇乱子伦hd| 青青草原99热| 久久久久久18| 五月天婷婷综合网| 黄色精品五月婷婷| 日日夜夜天天综合| 婷婷亚洲激情在线观看视频| AA片在线观看视频在线播放| 婷婷五月中文字幕国产| 九九爱精品网站| 99精品大片| 91热网址| 久碰视频| 丁香五月婷婷成人色区| 国产毛片操B| 影音先锋91资源站| 丁香五月久久| 色婷婷五月天激情综合| 97超级啪啪在线观看| 精品久久艹| 玖玖婷婷综合| 99综合视频| 婷婷激情综合色五月久久,色婷婷丁香花,丁香婷婷五月情天,久久婷婷五月综合色 | 五月天艹天天| 久久丁香婷婷五月| 五月婷婷综合激情| 天天色天天搡| 日韩黄色中文字幕| 亚洲综合五月天婷婷| 97在线/亚洲| 思思热视频在线观看| 五月婷婷co.m| 成人AV网站在线| 九九热黄色| 六月丁香成人| 1024在线视频| 色五月综合激情| 五月丁香亭亭成人电影| 狠狠狠狠草草| 婷婷婷婷色| 亚洲午夜成人av电影网| 狠狠摸狠狠摸| 久99热| 丁香五月婷婷免费视频| 五月天com| 狠狠色噜噜狠狠色噜噜噜999| 精品9久| 淫视馆aV二区一区| 婷婷综合网站| 久热9| 婷婷五月天av小说| 九九热10| 婷婷丁香五月天在线| 日韩狠狠色| 亚洲午夜成人av电影网| 久婷久婷| 婷婷五月天亚洲精品| 丁香五月婷婷AV| se色婷婷视频| 婷婷五月AV| 久久这里只有国产视频| 九九99久久| 五月深情久久| 99色| 亚洲在线操| 亚洲婷婷成人五月天| 亚洲综合久| 99热传媒| 性爱久久| 日本久久婷婷| 噜噜色com| 国产夫妻操逼内射视频| 毛片新网地| 99riAV成人在线视频| 丁香五月天堂网| 99精品在线| 日日懆天天懆| 操操操av| 91操网| 久操人| www婷婷色| 五月婷婷开心网| 五月丁香六月婷婷啪啪| 色婷婷五月天小说网| 婷婷丁香色五月亚洲| 丁香五月婷婷五月| 婷婷五月天丁香综合网| 日韩免费视频| 婷婷亚洲综合| 91黄操| 欧美五月婷婷| 婷婷 月 丁香| 这里只有精品在线播放| www.国产亚洲69ty.久久久久久久久久久久 | 夜夜夜夜撸夜夜操| 一区二区三区四区无码| 五月色婷婷亚洲 | 色九月婷婷| 超碰免费在线| 91九色国产| 99热1| 成人在线99| 五月亭亭六月天| www.26uuu.com亚洲电影| 丁香五月第九色| 久久久妻人人人| 操逼毛片国语对白| 99毛片| 日本久久精品18| 激情五月综合第一页| AV免费在线网站| 婷婷丁香综合在线| 久久精品日| 婷婷丁香综合在线| 人人97操| 91se在线观看| 五月天婷综合| 影音先锋91| 亚洲性视频| 91在线观看www| 五月婷中文娱乐综合| 99精品丰满| 强奸幻女毛片| 欧美日韩五月婷婷| 香蕉视频91| 91操片| 啪啪综合网| j久久性爱视频| 激情深爱婷婷网| 久久亚洲A| 丁香六月av| 婷婷五月精品在线| 99视频精品8| 五月婷婷激情综合视频| 色婷狠狠| 五月激情婷婷综合| 亚洲色网址| 狠狠五月天| 日本视频久久| 久久久五月天婷婷| 色五月婷婷伊人| 婷婷五月天综合久久| 色综合婷婷| 99精品视频在线免费观看| 夜夜天天久久婷婷| 六月丁香婷婷五月| 久色激情| 婷婷午夜天| 欧美韩国日本| 色综啪啪| WWW色色色COm| 久热2025无码| 天天摸人人摸| 激情综合国产| 五月婷婷六月天| 天天日色情| 91人人操| 97丁香花五月天激情小说| 五月婷婷色情| 日本99色| 久久曰曰| 成人va在线| 丁香六月婷婷开心| 色五月婷婷开心| 噜噜狠狠色| 九九视频在线| 婷婷六久久| 五月丁香色婷婷色| www.sd-xiangsu.cpm| 丁香色综合| 无码激情| 亚洲丁香五冃97色| 九九热10| 日日噜狠狠色综合久久| 青草少妇激情| 色五月丁香五月| 色婷婷成人色网| 国产无人区大片| www。88热在线视频免费观看| 天天日天天干天天天| 亚洲人妻av| 丁香五月婷婷激情97| 9999热精品| 在线观看熟女少妇| 久久婷婷综合五月天| 欧美性爱五月天| 亚洲图色五月天| 色婷婷五月天天天天天| 高清无码入口| 国产美女无遮挡裸体毛片A片| 九九九九无码| 色婷婷五月基地在线| 欧美激情综合色综合啪啪五月| 91综合在线| 在线视频激情网站| 久久五月丁香综合17C| 91黄操| 婷婷五月另类网站| 成人五月天在线观看| 久久爱婷婷| 在线观看国产高清视频免费网站| 欧美色图天堂网色| 思思热国产在线| 欧美色婷婷| 色噜噜狠狠色综合网| 伊人丁香花综合影院| 婷婷丁香六月| 在线成人av播放| 五月丁香婷婷激情久久| av九九| 99日在线观看视频| 色噜噜在线| 日本九九九九| 五月丁香婷中文| 五月花在线观看视频| 在线看的免费网站| 久青青久| 五月天婷婷视频小说| 狠狠色丁香乆乆| 色婷婷精品小视频| 人妻操逼视频| 九色91美女| 日韩aaa| 亚州欧美黄色电影| 人人摸人人射| 人妻久久久久久| 99久久婷婷| 人妻久热| 五月婷婷成人| 久久久五月婷婷| 色综合天天| 久久婷网| 色五月婷婷五月天| 91精品国产综合久久蜜芽解析速度| 国产热精品| 国产亚洲精品久久久久久郑州| 99日韩| 亚洲在线综合| 丁香久久五月婷综合| 天天天干夜夜夜操| 一级性感毛片| 日本五月婷| 六月婷综合| 欧美噜一噜| 噼里啪啦在线观看免费完整版视频| 无码se| 激情五月丁香五月| 最新色色五月天| 丁香五月婷婷AV| 丁香九月综合激情| 日韩成人AV在线播放| 97干视频在线| 中文字幕精品在线观看| 91肏| 亚洲中文字幕AV| 亚洲精久久| 五月天综合色| 五月天六月丁香| 99热这里都是精品| 黄色99网| 久久婷婷七月丁香| 亚洲激情网站| 超级97碰碰| 五月丁香婷婷综合| 人人操操| 大香蕉五月丁香| 99视频内射三四| 婷婷丁香18| 五月丁香婷婷综合在线| 亚洲中文字幕在线观看| 五月丁香成人版| 亚洲天堂AV综合网| 可以免费观看的av| 免费婷婷| 97香蕉碰碰人妻国产欧美| 嫩草AV久久伊人妇女超级A| 91日本在线观看| 国产26uuu视频| 久久九九热38| 九九精品免费| 9久精品视频| 99热99在线| 青草热视频这里只有精品| 丁香色情五月综合激情| 日韩欧美一级大黄网站| 米奇激情婷婷| 99精品高潮| 久热这里| 丁香五月成人网| 99热乎| 久久免费干| 黄色AV日韩| 米奇影视资源婷婷狠狠色激情欧美五月丁香| 久久精品99国产精品日本| 精品,99| 超级黄色片| 国产精品美女| 五月伊人视频在线看| 98热精品| 日本色色色| 九九九九九九九热| 97热在线精品| 六月婷婷五月丁香| 婷婷五月天欧美| 天天看A片| 九九精品免费视频99| 991国产精选视频在线播放下载| 婷五月丁香俺| 欧美成人在线观看| 色婷婷综合影院| 亚洲激情综合| 色婷婷丁香AV综合| 婷婷久久久| 99热在线观看这里只有精品| 日本久久精品18| 成人精品视频99在线观看免费| 婷婷五月天亚洲精品| 182TV亚洲| 五月丁香花成人社区| 色播五月综合网| 婷婷瑟五月天久久综合| 婷婷色在线播放| 深爱激情五月天| 很很干夜夜干| 婷婷五月天伊人在线| 99丁香五月婷婷在线| 天天干天天干天天| 综合久久99| 五月婷婷播| 日本WWW九九九| 国产五月视频| 婷婷综合色| 秋霞三及片| 婷婷亚洲五| 六月丁香狠狠爱| 色婷婷狠狠18禁| 丁香婷婷九月| 五月丁香亭亭天天舔| 丁香婷婷色色| 黄色av网站在线免费播放| av大香蕉| 噜噜狠狠色| 99热只有这里才是精品| 成人五月天婷婷| 色五月超碰| 99热97美女| 婷婷射综合| 深夜A片| 99热这里只有精品69| 欧美日韩AAAAA| 婷婷亚洲日本| 网色99| 91精品无码久久久久久五月天| 变态另类色图| 婷婷5月久久综合网站| 亚洲熟妇AV乱码在线观看| a久久| 人人干av| 五月天综合婷婷| 色啪网| 久/久精品99看9| 国产成人AV在线| 激情综合在线观看| 亚州操操| 啪啪婷婷五月天激情| 欧美乱码国产一级A片| 亚洲综合五月天婷婷| 激情五月天电影| 久久久久丁香婷婷五月天| 丁香六月色婷婷综合| 五月天六月婷婷电影| 99色免费视频| 婷婷丁香色五月久久88| 六月丁香好婷婷| 午夜婷婷五月天| 天天操电影院色狼性av| 色综合色综合色综合| 丁香六月亭亭久久综合| 九九热精品6| 天天做天天爱天天要| 五月丁香六月情| 66色在线日韩| 91要啪| 99久视频| 九九热九九| 99精品成人无码A片观看金桔| 无码激情AAAAA片-区区| 91精品激情9| 久久久久久久久18久久| 丁香五月 无码| 色色色色色五月| 99碰网站| 思思99热这里只有精品| 婷婷五月丁香五月丁香| 色五月婷婷视频| 色色网五月激情| 六月婷婷激情| 精品久热| 激情丁香五月| a性生活久久无| 月色色综合婷婷网| 91色五月| 噜噜噜噜噜日本视频| 国产精品久久久丁香五月八戒视频| 天天色域综合网| 丁香五月激情网| 99综合免费视频| 成人精品视频99在线观看免费| 九月婷婷在线视频| 婷婷五月丁香色播| 九九香蕉网| 97色伦另类图片小说视频| 天天操夜夜橾| 成人一级片| 五月丁香啪啪网| 成人AV播放| 99久在线观看| 色噜噜,噜噜色| 99re热视频这里只精品5| 亚洲av成人在线| 无码人妻丰满熟妇奶水区码| 伊人青涩网| 久久丁香五月天| 另类国产综合| 无码髙清| 拍真实国产伦偷精品| 天天综合色99| 噜噜噜噜噜在线| 日本不卡五月婷婷丁香| 激情视频综合| 亚州美女| 伊人婷婷五月天av| 激情99热| 天天日 天天草| 91久久久久久久| 国洲夜色亚热在线久久| 五月婷五月婷伊人伊人五月婷| 日韩欧美骚货| 五月婷婷色色色| 97人人操人人插| 日韩人妻无码专区| 99久久九九| 丁香五月天激情视频| 97在线天堂| www久久99com| 九九热在线精品| 精品亚洲国产成AV人片传媒| 九九99在线视频| 婷婷五月天激情偷拍| 青青草原伊人网| 日韩人妻AV在线| 1024国产| 99免费视频网| www.色婷婷| 538任你爽视频不一样的| 色五月天天| 超碰亚洲天堂| 亚洲区1| 狠狠88综合久久久久噜噜噜| 日本美女五月天| 婷婷色情 | 99re久久| 五月婷婷五月丁香| 日本人妻伦在线中文字幕| 五月丁香 啪啪| 五月丁香欧美综合| 香蕉久久国产AV一区二区| www.久久久久久久| 思思热AV| 丰满少妇猛烈A片免费看观看| 六月丁香大香蕉| 亚洲日韩欧美综合VA| 96精品成人无码A片观看金桔 | 天天爽天天爽| 9热视频在线观看| 五月天久久网站| 精品人妻午夜一区二区三区四区| 九九99免费理论| 五月丁香婷婷免费视频| 超碰婷婷五月| www.五月激情.com| 丁香色五月天| 久久精品91视频| 五月婷视屏在线观看| 1024亚洲无码| 思思热久在线观看视频| 精品久久99码| 日韩av在线免费观看| 婷婷六月啪啪 | 激情婷婷另类| 人人操av| 五月天激情国产综合婷婷婷就去爱| 色爽九九| 91热网址| 99精品在线观看视频| 潮汕成人AV片在线| 五月丁香久久丝袜啪啪| 日本欧美成人片AAAA| site:xmssd.com| 在线99热| 在线中文字幕av| 综合色影| 婷婷色在线视频| 可以看的av| 青青日韩| 日日操夜夜爽| 狠狠九九婷婷韩| 色五月丁香五月| 888久久久| 99视频精品全部观看10| 婷婷五月激情综合啪啪| 91精品综合久久久久久五月丁香| 久久久久9久无码视频| 天天热夜夜操| 97操碰98| 深爱五月日韩| 91人无码久久久久久| www夜夜操com| 野外99热| 五月天婷婷视频小说| 成人AV网站在线| 激情深爱五月天| 99WWW免费视频| 99re视频在线播放| 激情丁香婷婷| 99精品视频网| 另类五月婷婷| 婷婷丁香五月综合| 丁香久久五月天视频在线观看 | 丁香午月AV中文字幕| AA丁香综合激情| 狠狠干在线视频| AV色色天堂中文| 久久免费婷婷视频| 久久影视婷婷五月| 狠狠色五月| 婷婷五月色情天| 大香蕉九九| 国产美女最新VA在线免费观看| 色五月丁香A欧美com | 99热综合在线| 99国产精品久久久久久久久久久| 色情五月天se| 黄色高清无码| 婷婷日欧美在线观看| 日韩一级A片黄色| 99色色网| 天天摸天天高潮天天爽| 亚洲啪啪精品| 日本操碰碰| 久久久色婷婷五月天| 成人无码精品1区2区3区免费看| 日本一级黄色片。| 五月网在线| 91九色在线视频| 午夜成人av在线| 色五月婷婷激情五月| 亚洲韩国日产综合AV| 99色色| 亚洲综人色综网| 夜夜嗨一区二区三区直播内容 | 强伦轩人妻一区二区电影| 激情五月天婷婷五月天| 亚洲瑟瑟精品在线| 丁香色影院| 激情小说五月天| 国产美女最新VA在线免费观看| 爱狠射| 婷婷五月天AV| 丁香五月深爱五月婷婷| 另类丁香综合| 99视频| 久色资源网| 亚洲成人一区| 亚洲狠狠爱婷婷| 五月天丁香成人| 丁香开心深爱| 操久久精| 北京熟妇搡BBBB搡BBBB| 激情五月丁香亭亭 | 91综合网| 日日杆天天| 亚洲aV写真天天综合网久久| 99操碰| 免费V片在线|