怎樣固定依賴的依賴的依賴的版本


前言

說到 package.json 的版本固定,你或許會想到 dependencies devDependencies 。

"@ant-design/pro-layout": "^4.5.16",
    "@antv/data-set": "^0.10.2",
    "antd": "^3.23.6",
    "classnames": "^2.2.6",
    "dva": "^2.4.1",
    "echarts": "^4.7.0",
    "echarts-for-react": "^2.0.15-beta.1",
    "html2canvas": "^1.0.0-rc.5",
    "jquery": "^3.5.0",
    "lodash": "^4.17.11",
    "moment": "2.24.0",
    "omit.js": "^1.0.2",
    "path-to-regexp": "^3.1.0",
    "qs": "^6.9.0",
    "react": "^16.8.6",
    "react-copy-to-clipboard": "^5.0.1",
    "react-dom": "^16.8.6",
    "react-helmet": "^5.2.1",
    "react-read-more-read-less": "^1.0.7",
    "react-to-print": "^2.6.3",
    "redux": "^4.0.1",
    "slash2": "^2.0.0",
    "umi": "^2.9.6",
    "umi-plugin-pro-block": "^1.3.4",
    "umi-plugin-react": "^1.10.1",
    "umi-request": "^1.2.7",
    "webpack-theme-color-replacer": "^1.2.15"
  },

注意moment那一行,去掉了 ^ 符號。此時版本就被固定了。
但是,這個只對開發者主動引用的依賴有效,對“依賴的依賴”,“依賴的依賴的依賴”是無效的。
舉個例子,antd 用了 rc-calendar ,rc-calendar 用了 moment,假設moment最新版是2.4.1,那么,rc-calendar使用的moment仍然是2.4.1,而不是2.4.0。
從package-lock.json中可以看出。

    "rc-calendar": {
      "version": "9.15.6",
      "resolved": "https://registry.npmjs.org/rc-calendar/-/rc-calendar-9.15.6.tgz",
      "integrity": "sha512-TJD4cUXsBAjyCzo7BaGb86nZyJetBUt/Rpu0H1WWhp9AJc+Tl7aj7TCD3TM5Y8Ak/yxsA8WDBMuKw1XdQMsM5g==",
      "requires": {
        "babel-runtime": "6.x",
        "classnames": "2.x",
        "moment": "2.x",
        "prop-types": "^15.5.8",
        "rc-trigger": "^2.2.0",
        "rc-util": "^4.1.1",
        "react-lifecycles-compat": "^3.0.4"
      }
    },

怎樣解決

方法1

npm 和 yarn 都有 lock 機制。

  • 在 npm 里面叫 package-lock.json.
  • 在 yarn 里面叫 yarn.lock.
    舉個例子。
  1. 我創建了一個項目,並安裝了依賴。其中 antd 用的版本是 3.23.5,也是當時的最新版。
  2. 第二天,我刪除了依賴,但沒有刪除 package-lock.json (yarn.lock)而此時 antd 的版本更新到了 3.23.6.
  3. 我再次安裝依賴。因為 package-lock.json (yarn.lock)存在,所以我仍然會安裝 3.23.5。
  4. 這個規則在雲效里也是適用的。只要把 package-lock.json (yarn.lock)上傳到git,雲效也會按照這個文件的約定去打包。

方法2

上一個方法,如果 package-lock.json (yarn.lock)不存在,或者需要大范圍更新(每一個依賴類庫的每一個版本都會有唯一的sha512標識碼,手動更改不現實),就不適用了。但我們還有另一個辦法。
yarn的作者就這個問題專門寫了一個文檔。

鏈接:https://github.com/yarnpkg/rfcs/blob/master/implemented/0000-selective-versions-resolutions.md

文章很長,不看也可以,我們只需要知道怎么解決這個問題。
package.json里面加一個對象,和 dependencies devDependencies 平級。

"resolutions": {
    "**/moment": "2.24.0"
  },

這樣,整個項目中所有的moment的版本都會指定為2.24.0。
但你可能會需要一些更精細的設置(比如只指定“某個依賴的某個依賴的某個依賴”的版本)。你可以從上面的文章里找到答案。

Q&A

  • npm是否支持resolutions設置?
    不確定,因為我平時裝依賴用的是yarn。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM