Làm cách nào để ghi đè các phiên bản phụ thuộc NPM lồng nhau?


290

Tôi muốn sử dụng grunt-contrib-jasminegói NPM. Nó có sự phụ thuộc khác nhau. Một phần của biểu đồ phụ thuộc trông như thế này:

─┬ grunt-contrib-jasmine@0.4.1
  ├─┬ grunt-lib-phantomjs@0.2.0
   ├─┬ phantomjs@1.8.2-2

Thật không may, có một lỗi trong phiên bản này phantomjskhiến nó không thể cài đặt chính xác trên Mac OS X. Điều này đã được sửa trong phiên bản mới nhất.

Làm thế nào tôi có grunt-lib-phantomjsthể sử dụng một phiên bản mới hơn phantomjs?

Một số bối cảnh bổ sung:


Chỉ cần git clonehoặc ngã ba mô-đun yêu cầu. Bạn cũng có thể loại bỏ lồng nhau phantomjsbằng tay.
Aleksei Zabrodskii

3
grunt-contrib-jasminelà ngày 0.5.1, sử dụng grunt-lib-phantomjs@0.3.1, sử dụng phantomjs@1.9.1-0:)
gustavohenke

Câu trả lời:


238

Bạn có thể sử dụng chức năng thu nhỏ npm , để ghi đè bất kỳ phụ thuộc hoặc phụ thuộc phụ.

Tôi vừa mới thực hiện điều này trong một dự án lớn của chúng tôi. Chúng tôi cần một phiên bản kết nối mới hơn, kể từ 2.7.3. đã gây rắc rối cho chúng tôi. Vì vậy, tôi đã tạo một tệp có tên npm-shrwrap.json:

{
  "dependencies": {
    "grunt-contrib-connect": {
      "version": "0.3.0",
      "from": "grunt-contrib-connect@0.3.0",
      "dependencies": {
        "connect": {
          "version": "2.8.1",
          "from": "connect@~2.7.3"
        }
      }
    }
  }
}

npm sẽ tự động nhận nó trong khi thực hiện cài đặt cho dự án.

(Xem: https://nodejs.org/en/blog/npm/managing-node-js-dependencies-with-shrinkwrap/ )


7
Khi tôi làm điều này, chỉ có sự grunt-contrib-connectphụ thuộc và con cái của nó được cài đặt. Tất cả các phụ thuộc khác của tôi trong pack.json không được cài đặt.
iDVB

5
Tôi đã có cùng một vấn đề như @iDVB. Cuối cùng tôi đã chỉnh sửa node_modulesthư mục để kết xuất phụ thuộc thu nhỏ đầy đủ chính xác những gì tôi muốn, không chỉ ghi đè. Nhưng vẫn là một loại giải pháp đau đớn.
Kobold

2
@Domi tập tin này được tạo bằng cách chạy npm shrwrap, các mục nhập không được thêm bằng tay
glasspill

13
Thật không may, như đã đề cập trong lỗi đó, với npm4, cách tiếp cận tối giản không còn hiệu quả. (Khi xóa node_modules, chạy một cài đặt với một shrinkwrap tối thiểu dường như lại devDependenciescòn nguyên vẹn mặc dù bỏ qua dependencies, nhưng chạy một cài đặt loại bỏ các mục không rõ ràng, vì vậy bây giờ điều quan trọng là để chạy npm shrinkwrapđể có được một tập tin đầy đủ, sửa đổi các phần trong câu hỏi, và sau đó chạy npm installlại)
Brett Zamir

6
npm 6.4 sẽ ghi đè lên tệp thu nhỏ và sử dụng các phụ thuộc đã lỗi thời
ShadSterling

83

Đối với những người từ năm 2018 trở đi, sử dụng npm phiên bản 5 trở lên: chỉnh sửa package-lock.json: xóa thư viện khỏi "requires"phần và thêm vào phần "phụ thuộc".

Ví dụ: bạn muốn deglobgói sử dụng globphiên bản gói 3.2.11thay vì phiên bản hiện tại. Bạn mở package-lock.jsonvà xem:

"deglob": {
  "version": "2.1.0",
  "resolved": "https://registry.npmjs.org/deglob/-/deglob-2.1.0.tgz",
  "integrity": "sha1-TUSr4W7zLHebSXK9FBqAMlApoUo=",
  "requires": {
    "find-root": "1.1.0",
    "glob": "7.1.2",
    "ignore": "3.3.5",
    "pkg-config": "1.1.1",
    "run-parallel": "1.1.6",
    "uniq": "1.0.1"
  }
},

Xóa "glob": "7.1.2",khỏi "requires", thêm "dependencies"với phiên bản thích hợp:

"deglob": {
  "version": "2.1.0",
  "resolved": "https://registry.npmjs.org/deglob/-/deglob-2.1.0.tgz",
  "integrity": "sha1-TUSr4W7zLHebSXK9FBqAMlApoUo=",
  "requires": {
    "find-root": "1.1.0",
    "ignore": "3.3.5",
    "pkg-config": "1.1.1",
    "run-parallel": "1.1.6",
    "uniq": "1.0.1"
  },
  "dependencies": {
    "glob": {
      "version": "3.2.11"
    }
  }
},

Bây giờ xóa node_modulesthư mục của bạn , chạy npm installvà nó sẽ thêm các phần còn thiếu vào "dependencies"phần.


4
Điều này là tốt đẹp, miễn là npm installchạy một lần. Trong trường hợp của tôi, các chỉnh sửa là cần thiết vì dep lồng nhau gây ra lỗi.
ppasler

59
điều này sẽ bị xóa bất cứ khi nào bạn chạy npm ithay vì chỉnh sửa gói-lock.json của bạn và thêm phụ thuộc con vào "phụ thuộc" ở đó, thêm phần phụ thuộc con vào phần "phụ thuộc" của
gói.json

6
Tôi đã tạo một thư viện chính xác cho bạn một cách tự động: github.com/rogeriochaves/npm-force-resolutions
Rogerio Chaves

14
Nó hoạt động nhưng sau đó nếu tôi chạy npm installlại thì tất cả các thay đổi sẽ package-lock.jsonđược hoàn nguyên và tôi nhận được phiên bản xấu của dep.
2rs2ts

14
Tôi chạy npm civà điều này không chạm vàopackage-lock.json
sschoust


0

Tôi đã có một vấn đề trong đó một trong những phụ thuộc lồng nhau có lỗ hổng kiểm toán npm, nhưng tôi vẫn muốn duy trì phiên bản phụ thuộc cha mẹ. giải pháp thu nhỏ npm không hiệu quả với tôi, vì vậy tôi đã làm gì để ghi đè lên phiên bản phụ thuộc lồng nhau:

  1. Xóa phần phụ thuộc lồng nhau trong phần 'yêu cầu' trong gói-lock.json
  2. Thêm phụ thuộc được cập nhật trong DevDependencies trong gói.json, để các mô-đun yêu cầu nó vẫn có thể truy cập được.
  3. npm tôi

-1

NPM shrwrap cung cấp một giải pháp tốt cho vấn đề này. Nó cho phép chúng ta ghi đè phiên bản đó của một phụ thuộc cụ thể của một mô-đun phụ cụ thể.

Về cơ bản, khi bạn chạy cài đặt npm, trước tiên npm sẽ tìm trong thư mục gốc của bạn để xem liệu tệp npm-shrwrap.json có tồn tại hay không. Nếu có, nó sẽ sử dụng điều này trước tiên để xác định các phụ thuộc gói, và sau đó quay lại quy trình làm việc thông thường thông qua các tệp pack.json.

Để tạo một npm-shrwrap.json, tất cả những gì bạn cần làm là

 npm shrinkwrap --dev

mã:

{
  "dependencies": {
    "grunt-contrib-connect": {
      "version": "0.3.0",
      "from": "grunt-contrib-connect@0.3.0",
      "dependencies": {
        "connect": {
          "version": "2.8.1",
          "from": "connect@~2.7.3"
        }
      }
    }
  }
}

3
Điều này có khác với câu trả lời hiện đang được chấp nhận không? Câu trả lời đó có hai nhận xét được đánh giá cao cho thấy rằng các phiên bản mới hơn của npm yêu cầu các bước thủ công bổ sung hoặc thực hiện những điều không mong muốn với giải pháp này. đây không phải là trường hợp à?
Fabio Beltramini

-1

Tôi tìm thấy một giải pháp làm việc cho tôi.

Vì thế. Trước tiên hãy chỉnh sửa tệp npm-shrwrap.json của bạn như được đề xuất cho tất cả các giải pháp khác.

Sau đó, (trên Windows):

  • Nhấp chuột phải vào tệp 'npm-shrwrap.json'
  • Tính chất
  • Trong Thuộc tính, chọn 'Chỉ đọc'. Điều này sẽ ngăn npm sửa đổi tệp mpn-shrwrap.json.

Các giải pháp được đề xuất khác là đủ tốt nếu bạn thực hiện thao tác 'npm install' chỉ một lần. Nhưng sau lần cài đặt 'npm đầu tiên, tập tin' npm-shrwrap.json 'lại được sửa đổi như trước khi sửa đổi.


-1: điều này sẽ yêu cầu bạn mở khóa lại tệp mỗi lần bạn muốn thực hiện thay đổi. Trong những trường hợp đó, dù sao bạn cũng sẽ mất các chỉnh sửa thủ công vào tệp thu nhỏ. Ngoài ra, bất cứ ai hợp tác với mã của bạn cũng cần phải kích hoạt hack này.
thomaux
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.