package.json에서 필요한 Node.js 버전을 지정하려면 어떻게해야합니까?


261

Node 버전 12 이상이 필요한 Node.js 프로젝트가 있습니다. packages.json 파일에서이를 지정하여 설치 프로그램이 사용자에게 업그레이드해야하는지 자동으로 확인하고 알리도록하는 방법이 있습니까?


1
: 또한 node.version를 사용하여 아담의 반응에 유사한 방법 stackoverflow.com/a/48691987/3032209
Yair Kukielka


질문은 이미 여기에 있습니다 : 특정 node.js 버전을 사용하는 방법?
cilap

API 사용량을 검사하여이 필드를 적절한 값으로 자동 설정할 수있는 도구가 있는지 궁금합니다.
괴짜

답변:


287

"엔진"필드를 사용할 수 있다고 생각합니다.

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

코드가 하위 버전에서 작동하지 않는다고 말하면 "engineStrict"플래그도 원할 것입니다.

{ "engineStrict" : true }

package.json 파일에 대한 설명서 는 npmjs 사이트 에서 찾을 수 있습니다.

최신 정보

engineStrict더 이상 사용되지 않으므로 경고 만 표시됩니다. npm config set engine-strict true원하는 경우 사용자가 실행 해야합니다.

업데이트 2

아래에서 지적한 바와 같이, .npmrc프로젝트의 루트 (package.json 파일과 동일한 레벨)에 파일을 텍스트로 작성 engine-strict=true하면 노드 버전이 호환되지 않는 경우 설치 중에 오류가 발생합니다.


13
github.com/npm/npm/blob/master/CHANGELOG.md#enginestrict "거의 거의 사용 되지 않는 package.json 옵션 engineStrict은 몇 개월 동안 사용되지 않아 사용할 때 경고가 발생합니다. npm @ 3부터는 필드는 무시되고, 엔진 위반은 경고를 생성합니다 당신은, 사용자로, 원하는 경우 엄격한 엔진 필드 집행, 바로 실행 NPM의 설정 세트 엔진 엄격한 사실. "
마이크 테드

1
cd .. && npm i <folder-name>프로젝트 자체를 확인하기 위해 기억하십시오 . 그러나 이것은 자체적으로 전체 빌드를 트리거합니다.
mlunoe

6
왜 지구상에서 그들은 더 이상 사용되지 않습니다. 그것은 모든 의미를
잃어 버렸습니다

15
engine-strict=true.npmrc에 추가 해도 이제 같은 효과가 있습니다
ben

4
@ 벤 퍼펙트, 감사합니다! 그리고 이것은 최소한 전체 팀이 엔진 버전 요구 사항을 준수해야한다고 약속 할 수 있습니다.
Joshua Pinter

115

더하다

package.json

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

파일에 .npmrc( package.json같은 디렉토리에 가까운 )

engine-strict=true

3
이것은 최종 사용자가 노드를 실행할 때 올바른 버전의 노드를 사용하지 않는 것에 대한 중대한 오류를 제공하는 가장 쉬운 솔루션입니다 npm install. 작동 yarn뿐만 아니라
jcollum

이것은 전혀 효과가없는 것 같습니다. 나는까지 내 설정 package.json위의 유사한 "엔진"과 (와 11.13.06.7.0), 그리고 .npmrc아무것도하지만, 내용은 위에서 지정한. nvm에서 나를 이전 노드 버전으로 전환 한 다음 실행 npm install했지만 종속성을 설치하고 엔진 버전 불일치조차 언급하지 않았습니다.
Adrian

54

Ibam engineStrict이 말했듯 이 이제는 더 이상 사용되지 않습니다. 그러나이 솔루션을 찾았습니다.

check-version.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);
}

package.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"
  }
}

자세한 내용은 https://medium.com/@adambisek/how-to-check-minimum-required-node-js-version-4a78a8855a0f#.3oslqmig4 에서 확인하십시오.

.nvmrc

그리고 하나 더. 특정 노드 버전이 필요한 경우 '.nvmrc'도트 파일을 사용할 수 있습니다. https://github.com/creationix/nvm#nvmrc

그러나 npm 스크립트 (및 원사 스크립트)만이 존중됩니다.


2
이것은 세트 엔진 지원 중단 및 많은 사람들이 nvm으로 버전을 전환하여 발생할 가능성이 있다는 사실을 고려할 때 2019 년에 가장 좋은 대답입니다.
craft

14

.nvmrc

이처럼 NVM사용하고 있다면 주어진 프로젝트에 필요한 nodejs 버전을 git-tracked .nvmrc파일로 나타낼 수 있습니다 .

echo v10.15.1 > .nvmrc

이것은 cd제정신 에 자동으로 적용되지 않으며 , 사용자는 다음을 수행해야합니다.

nvm use

이제 해당 버전의 노드가 현재 쉘에 사용됩니다.

가지고있는 노드의 버전을 나열 할 수 있습니다.

nvm list

.nvmrchttps://github.com/creationix/nvm/tree/02997b0753f66c9790c6016ed022ed2072c22603#nvmrc에 문서화되어 있습니다.

해당 노드 버전을 자동으로 선택하는 방법 cd은 다음과 같습니다. 프로젝트를 기반으로 올바른 버전의 노드로 자동 전환

NVM 0.33.11로 테스트되었습니다.


8

이 작업을 수행하는 또 다른 간단한 방법이 있습니다.

  1. npm install Node@8 (노드 8을 package.json의 종속성으로 저장)
  2. 여러분의 앱은 누구든지 노드 8을 사용하여 실행되며 심지어 원사 사용자도 가능합니다!

이것은 node노드를 패키지 바이너리로 제공하는 패키지 일뿐 이므로 작동합니다 . node_module / .bin 만 포함하면 스크립트를 패키징 할 수있는 노드 만 만들 수 있습니다. 메인 쉘이 아닙니다.

https://twitter.com/housecor/status/962347301456015360 에서 트위터에 대한 토론을 참조하십시오.


5
동의하지 않을 경우 잠재적으로 문제를 숨기고 설치되지 않은 경우 다른 버전의 노드를 사이드로드 할 수 있습니다.
Brendan Hannemann

7
-1 이것은 끔찍한 (정말 끔찍한) 아이디어이기 때문입니다. 실직 상태라면 먼저 회사에 자금을 지원해야하며 그곳에서 일을 시작할 수 있습니다.
ozanmuyes

2
나에게 좋은 생각 인 것 같습니다. 별도의 프로젝트를위한 별도의 노드 버전. 다른 업그레이드없이 안전하게 업그레이드 할 수 있습니다. catch만이 ./node node-sass아니라 .bin에서 실행해야합니다 node-sass. 모든 .bin 파일에 대해 동일한 지 확실하지 않습니다.
Jon

2
이것은 간단하고 우아한 솔루션입니다. 제품을 개발하는 팀 구성원이 이러한 일이 발생한다는 것을 알고있는 한, 이것이 훌륭한 답변이라고 생각합니다. 우리는 대기업에서이 기술을 사용하여 수십 개의 웹 프론트 엔드 제품에 대한 다양한 노드 버전을 처리합니다. 제품 간을 전환 할 때 nvm을 사용하여 지속적으로 전환 할 필요가 없습니다.
Nathan Bedford

2
이 솔루션에는 장단점이 있습니다. 노드 버전 캡슐화는 잠재적으로 가장 큰 프로입니다. 이 방법으로 배포하려는 경우 단점은 부풀린 도커 이미지 크기입니다.
ivosh

0

모카 테스트 사례 예 :

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
단위 테스트가 아니어야합니다. package.json / dotfiles
bgcode를 사용하십시오.

2
그러나 단위 테스트는 이것을 위해 설계되었다.>
Jamie Nicholl-Shelley

단위 테스트를 실행하려면 노드가 필요하기 때문입니다. 존재하는 노드 버전이 너무 오래된 경우 테스트가 단순히 실행되지 않거나 구문 오류 또는 smth로 실패합니다. 이와 유사하여 단위 테스트 지점을 무너 뜨립니다. 인증 양식 뒤에 비밀번호 재설정 양식을 숨기는 것과 같습니다. 암호를 기억할 수 없으면 암호 재설정 기능을 사용해야하지만 암호를 기억하지 못하므로 암호를 사용할 수 없습니다.
ankhzet
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.