Làm cách nào tôi có thể chỉ định phiên bản Node.js được yêu cầu trong pack.json?


261

Tôi có một dự án Node.js yêu cầu Node phiên bản 12 trở lên. Có cách nào để chỉ định điều này trong tệp tests.json, để trình cài đặt sẽ tự động kiểm tra và thông báo cho người dùng nếu họ cần nâng cấp?


1
Một cách tương tự như phản hồi của Adam, cũng sử dụng node.version: stackoverflow.com/a/48691987/3032209
Yair Kukielka


Câu hỏi đã được hỏi ở đây: Làm cách nào để thực thi một phiên bản node.js cụ thể để sử dụng?
cilap

Tôi tự hỏi liệu có công cụ nào có thể tự động đặt trường này thành một giá trị phù hợp hay không bằng cách kiểm tra việc sử dụng API.
geekley

Câu trả lời:


288

Tôi nghĩ bạn có thể sử dụng trường "động cơ":

{ "engines" : { "node" : ">=0.12" } }

Như bạn đang nói mã của bạn chắc chắn sẽ không hoạt động với bất kỳ phiên bản thấp hơn nào, bạn cũng có thể muốn cờ "engineStrict":

{ "engineStrict" : true }

Tài liệu cho tệp pack.json có thể được tìm thấy trên trang web npmjs

Cập nhật

engineStricthiện không được chấp nhận, vì vậy điều này sẽ chỉ đưa ra cảnh báo. Bây giờ người dùng sẽ chạy xuống npm config set engine-strict truenếu họ muốn điều này.

Cập nhật 2

Như ben đã chỉ ra bên dưới, việc tạo một .npmrctệp ở gốc của dự án của bạn (cùng cấp với tệp pack.json) với văn bản engine-strict=truesẽ buộc lỗi trong khi cài đặt nếu phiên bản Node không tương thích.


13
github.com/npm/npm/blob/master/CHANGELOG.md#enginestrict "Các tùy chọn package.json hiếm khi được sử dụng engineStrictđã được tán thành trong vài tháng, sản xuất cảnh báo khi nó được sử dụng. Bắt đầu với NPM @ 3, giá trị của trường bị bỏ qua và vi phạm động cơ sẽ chỉ đưa ra cảnh báo. Nếu bạn, với tư cách là người dùng, muốn thực thi trường động cơ nghiêm ngặt, chỉ cần chạy cấu hình npm theo chế độ nghiêm ngặt của động cơ "
Mike Stead

1
Hãy nhớ để cd .. && npm i <folder-name>kiểm tra dự án. Tuy nhiên, điều này sẽ kích hoạt toàn bộ bản dựng trong đó.
mlunoe

6
Tại sao trên trái đất họ không tán thành điều đó .. nó mất hết ý nghĩa của nó sau đó
vasilakisfil

15
Thêm engine-strict=truevào .npmrc của bạn bây giờ cũng có tác dụng tương tự
ben

4
@ben Hoàn hảo, cảm ơn bạn! Và điều này có thể được cam kết để ít nhất toàn bộ nhóm của bạn được yêu cầu tuân thủ các yêu cầu phiên bản động cơ.
Joshua Pinter

115

Thêm vào

đến package.json

  "engines": {
    "node": ">=10.0.0",
    "npm": ">=6.0.0"
  },

vào tập tin .npmrc(gần package.json, cùng thư mục)

engine-strict=true

3
Đây là giải pháp đơn giản nhất cung cấp cho người dùng cuối một lỗi béo tốt về việc không có đúng phiên bản nút khi họ chạy npm install; làm việc với yarncũng
jcollum

Điều này dường như không có tác dụng gì cả. Tôi thiết lập phần của mình package.jsonvới phần "động cơ" tương tự như phần trên ( 11.13.06.7.0) và phần .npmrckhông có gì ngoài nội dung được chỉ định ở trên. Tôi đã chuyển nvm cho tôi sang phiên bản nút cũ hơn, sau đó chạy npm install, nhưng nó chỉ cài đặt các phụ thuộc và thậm chí không đề cập đến phiên bản động cơ không khớp.
Adrian

54

Giống như Ibam đã nói, engineStrictbây giờ không được chấp nhận. Nhưng tôi đã tìm thấy giải pháp này:

kiểm tra phiên bản.js:

import semver from 'semver';
import { engines } from './package';

const version = engines.node;
if (!semver.satisfies(process.version, version)) {
  console.log(`Required node version ${version} not satisfied with current version ${process.version}.`);
  process.exit(1);
}

gói.json:

{
  "name": "my package",
  "engines": {
    "node": ">=50.9" // intentionally so big version number
  },
  "scripts": {
    "requirements-check": "babel-node check-version.js",
    "postinstall": "npm run requirements-check"
  }
}

Tìm hiểu thêm tại đây: https://medium.com/@adambisek/how-to-check-minimum-required-node-js-version-4a78a8855a0f#.3oslqmig4

.nvmrc

Và một điều nữa. Một dotfile '.nvmrc' có thể được sử dụng để yêu cầu phiên bản nút cụ thể - https://github.com/creationix/nvm#nvmrc

Nhưng, nó chỉ được tôn trọng bởi các tập lệnh npm (và tập lệnh sợi).


2
Đây là câu trả lời tốt nhất trong năm 2019, trong bối cảnh mất giá của động cơ và thực tế là nhiều người (có thể) gặp phải điều này do chuyển đổi phiên bản với nvm.
thủ công

14

.nvmrc

Nếu bạn đang sử dụng NVM như thế này , điều mà bạn có thể nên, thì bạn có thể chỉ ra phiên bản nodejs cần thiết cho dự án đã cho trong .nvmrctệp theo dõi git :

echo v10.15.1 > .nvmrc

Điều này không có hiệu lực tự động cd, đó là lành mạnh: sau đó người dùng phải thực hiện:

nvm use

và bây giờ phiên bản của nút đó sẽ được sử dụng cho trình bao hiện tại.

Bạn có thể liệt kê các phiên bản của nút mà bạn có:

nvm list

.nvmrcđược ghi lại tại: https://github.com/creationix/nvm/tree/02997b0753f66c9790c6016ed022ed2072c22603#nvmrc

Cách tự động chọn phiên bản nút đó cdđã được hỏi tại: Tự động chuyển sang phiên bản Node chính xác dựa trên dự án

Đã thử nghiệm với NVM 0.33.11.


8

Có một cách khác, đơn giản hơn để làm điều này:

  1. npm install Node@8 (lưu Node 8 dưới dạng phụ thuộc trong gói.json)
  2. Ứng dụng của bạn sẽ chạy bằng Node 8 cho bất kỳ ai - kể cả người dùng Sợi!

Điều này hoạt động vì nodechỉ là một gói vận chuyển nút dưới dạng nhị phân gói của nó. Nó chỉ bao gồm là node_module / .bin có nghĩa là nó chỉ làm cho nút có sẵn cho các tập lệnh gói. Không phải vỏ chính.

Xem thảo luận trên Twitter tại đây: https://twitter.com/housecor/status/962347301456015360


5
Tôi không đồng ý, điều này có khả năng che giấu vấn đề và sẽ tải một phiên bản nút khác nếu nó không được cài đặt.
Brendan Hannemann

7
-1 bởi vì đây là ý tưởng khủng khiếp (thực sự khủng khiếp). Giống như nói rằng nếu bạn thất nghiệp, bạn nên tài trợ cho một công ty trước và bạn có thể bắt đầu làm việc ở đó.
ozanmuyes

2
Âm thanh như một ý tưởng tuyệt vời với tôi. Các phiên bản nút riêng biệt cho các dự án riêng biệt. Có thể nâng cấp một cách an toàn mà không cần nâng cấp những người khác. Chỉ bắt là phải chạy trong .bin ./node node-sasschứ không phải chỉ node-sass. Không chắc chắn nếu giống nhau cho tất cả các tệp .bin.
Jon

2
Đây là một giải pháp đơn giản và thanh lịch - miễn là các thành viên trong nhóm làm việc trên sản phẩm biết điều này đang xảy ra, tôi nghĩ đó là một câu trả lời tuyệt vời. Chúng tôi đang sử dụng kỹ thuật này tại một công ty lớn để đối phó với nhiều phiên bản Node cho hàng tá sản phẩm đầu cuối web. Loại bỏ sự cần thiết phải chuyển đổi liên tục với nvm khi qua lại giữa các sản phẩm.
Nathan Bedford

2
Giải pháp này có ưu và nhược điểm riêng. Đóng gói phiên bản nút có khả năng pro lớn nhất của nó. Nhược điểm là kích thước hình ảnh docker cồng kềnh nếu bạn sẽ triển khai nó theo cách này.
ivosh

0

Một ví dụ trường hợp thử nghiệm Mocha:

describe('Check version of node', function () {
    it('Should test version assert', async function () {

            var version = process.version;
            var check = parseFloat(version.substr(1,version.length)) > 12.0;
            console.log("version: "+version);
            console.log("check: " +check);         
            assert.equal(check, true);
    });});

1
Không nên là một bài kiểm tra đơn vị, hãy sử dụng
gói.json

2
Nhưng whhhhhhhy, một bài kiểm tra đơn vị được thiết kế cho việc này> .-
Jamie Nicholl-Shelley

Bởi vì bạn cần Node để chạy thử nghiệm đơn vị. Nếu phiên bản nút hiện tại quá lỗi thời, các bài kiểm tra sẽ không chạy hoặc chúng sẽ thất bại với lỗi cú pháp hoặc smth. tương tự, đánh bại điểm kiểm tra đơn vị. Nó giống như ẩn một hình thức đặt lại mật khẩu đằng sau một hình thức ủy quyền. Nếu bạn không thể nhớ mật khẩu, bạn cần sử dụng chức năng đặt lại mật khẩu, nhưng bây giờ bạn không thể sử dụng nó, vì bạn không nhớ mật khẩu.
ankhzet
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.