--save와 --save-dev의 차이점은 무엇입니까?


747

차이점은 무엇입니까?

npm install [package_name] --save

과:

npm install [package_name] --save-dev

이것은 무엇을 의미 하는가?


4
그래, 나는 이것에 대해 혼란스러워한다-Jenkins와 같은 지속적인 통합을 사용한다면 Jenkins는 devDependencies 모듈을 사용하여 테스트를 실행하는 것을 알고 있습니까? 나는 그렇게 가정하지만 그것은 분명하지 않습니다.
Alexander Mills

5
의존성과 devDependencies의 기능적 차이점은 무엇입니까?
Alexander Mills

5
--save-dev 옵션을 통해 설치된 패키지는 사용자가 실행할 때 다시 설치되지 않습니다 npm install --production. 이것이 운영상의 차이점입니다 (자세한 내용은 https://docs.npmjs.com/cli/install 참조 ).
Andrew

7
@MuhammadUmer 이것이 바로 사람들이 여기에 질문을하는 이유입니다. 아마도 실제 답변을 추가하는 것이 더 생산적 일 것입니다-이것은 내가 알지 못하는 흥미로운 차이점입니다.
Simon_Weaver

3
또한 환경 변수 NODE_ENV를 프로덕션으로 설정하면 npm install개발 패키지가 자동으로 제외됩니다.
Muhammad Umer

답변:


591
  • --save-dev개발 목적으로 패키지를 저장하는 데 사용됩니다. 예 : 단위 테스트, 축소 ..
  • --save 응용 프로그램을 실행하는 데 필요한 패키지를 저장하는 데 사용됩니다.

150
그것들은 어떻게 다릅니 까? 언제 한 대를 사용합니까? 패키지가 --save-dev 아래에 있으면 프로덕션에서 패키지를 계속 사용할 수 있습니까?
Dave Voyles

14
답은 첫 두 질문에 간결하게 대답합니다. 마지막 질문에 대한 대답은 "패키지가 --save-dev에있는 경우 여전히 프로덕션에서 패키지를 사용할 수 있습니까?"입니다. 확실히 수는 있지만 의도 한 것은 아닙니다.
Technetium

61
속기 버전 : -D대한 짧은 --save-dev-S에 대한 짧은--save
chrisco

164
이 답변은 매우 모호합니다. 작은 예조차도 이것을 명확하게하는 데 도움이 될 것입니다.
Choylton B. Higginbottom

33
npm 버전 5.0.0부터는 --save옵션이 더 이상 필요하지 않습니다. 그렇게 npm install my-package하면 package.json 파일의 종속성으로 "my-package"가 추가됩니다.
Martin Carel

642

의 차이 --save와는 --save-dev당신이 당신의 자신의 프로젝트에 그들 모두를 시도하면 즉시 눈에 띄지 않을 수 있습니다. 여기 몇 가지 예가 있습니다 ...

모멘트 패키지를 사용하여 날짜를 구문 분석하고 표시 하는 앱을 빌드한다고 가정하겠습니다 . 앱은 스케줄러이므로 다음과 같이 패키지를 실행해야 합니다 . 이 경우에는

npm install moment --save

패키지에 새로운 가치가 생길 것입니다.

"dependencies": {
   ...
   "moment": "^2.17.1"
}

개발할 때 테스트 스위트와 같은 도구를 사용하는 것이 실제로 도움이되며 jasmine-corekarma 가 필요할 수 있습니다 . 이 경우에는

npm install jasmine-core --save-dev
npm install karma --save-dev

이것은 또한 패키지에 새로운 가치를 창출합니다.

"devDependencies": {
    ...
    "jasmine-core": "^2.5.2",
    "karma": "^1.4.1",
}

앱을 정상 상태로 실행하기 위해 테스트 스위트가 필요 하지 않으므로--save-dev 유형 의존성입니다. 실제로 무슨 일이 일어나고 있는지 이해하지 못하면 상상하기가 어렵습니다.

NPM docs docs # dependencies 에서 직접 가져옴

의존성

종속성은 패키지 이름을 버전 범위에 매핑하는 간단한 개체로 지정됩니다. 버전 범위는 하나 이상의 공백으로 구분 된 설명자가있는 문자열입니다. tarball 또는 git URL로 종속성을 식별 할 수도 있습니다.

의존성 개체에 테스트 하네스 또는 트랜스 파일러를 넣지 마십시오. 아래의 devDependencies를 참조하십시오 .

문서에서도 테스트 하네스와 같은 모듈에 --save-dev를 사용하도록 요청합니다.

이것이 도움이 되길 바랍니다.


15
IMO, 'save'키워드가 문제라고 생각합니다. 개발을 위해 -dev 플래그를 만들고 배포를 위해 -deploy를하지 않는 이유는 무엇입니까? '저장'키워드보다 의미가 있습니다.
Thinh Vu

1
왜 패키지가 릴리스 패키지인지 dev 패키지인지 알고 결정하지 않는 이유는 무엇입니까? 패키지 개발자가 의도를 만들 때 설치 사용자가 이것을 결정하게 만드는 것이 이상해 보입니다.
CodeGrue

4
CodeGrue, React 구성 요소를 테스트하기 위해 jQuery 만 사용하는 경우 save-dev로 이동하지만 실제로는 기본 프로젝트를 빌드하는 데 사용하지 않을 수 있습니다. 예, 가능합니다. 그렇다면 포장업자는 왜 당신이 무엇을하고 있는지 알고 있습니까?
Michael Bruce

2
훨씬 더 명확합니다. 저는 Bootstra + Node.js 워크 플로를 처음 배우는 내장 된 사람입니다. 커프와의 차이점은 분명하지 않습니다.
Leroy105

3
@YakovL save-dev는 다른 사람이 패키지를 종속성으로 설치할 때 패키지가 설치되지 않음을 의미합니다. 이 경우 시작 / 빌드와 같은 스크립트를 실행하는 데만 사용되는 패키지는 필요하지 않으므로 개발 종속성에 배치됩니다. 다른 사람이 사용하기 위해 패키지가 아닌 웹 앱에서 작업하는 경우 전혀 걱정하지 않아도됩니다.
riv

111

기본적으로 NPM은 단순히 node_modules 아래에 패키지를 설치합니다. 앱 / 모듈에 대한 종속성을 설치하려는 경우 먼저 설치 한 다음 dependencies섹션에 추가해야 합니다 package.json.

--save-dev타사 패키지를 패키지의 개발 종속성에 추가합니다. 누군가 패키지를 설치할 때 설치되지 않습니다. 일반적으로 누군가 누군가 소스 리포지토리를 복제 하고 실행하는 경우에만 설치됩니다 npm install.

--save타사 패키지를 패키지의 종속성에 추가합니다. 누군가 실행할 때마다 패키지와 함께 설치됩니다 npm install package.

개발 종속성은 패키지 개발에만 필요한 종속성입니다. 여기에는 테스트 러너, 컴파일러, 패키저 등이 포함될 수 있습니다. 두 가지 유형의 종속성 모두 패키지 package.json파일에 저장 됩니다. --save에 추가 dependencies,에 --save-dev추가devDependencies

npm 설치 설명서는 여기를 참조하십시오.


37
나는 이것을 의심했다 ... 패키지가되지 않는 웹 앱을 빌드하는 경우 --save-dev와 --save를 상호 교환 가능하게 사용할 수있다. 즉, npm에서 다운로드했다. 차이점을 이해하는 것이 중요합니다.
VFein

13
npm install을 사용할 때 그 목적을 알려주는 누군가에게 감사합니다
CapturedTree

3
--save는 이제 2017 년 npm 5의 출시와 함께 npm 설치로 기본 설정되어 있습니다
NattyC

왜 복잡한 문장일까요? DevDependecy에서 개발자는 패키지를 설치할 수 있으며 devDevependency 만 업데이트됩니다. 따라서 새로운 개발자가 프로젝트 코드베이스를 복제하고 npm install => 여기서 dependency package name is going to install.node_modules .. 에서만 실행하십시오 . 개발자의 의존성과 같이 개발자의 패키지는 아닙니다.
Anupam Maurya

60

이에 대한 완벽한 예는 다음과 같습니다.

$ npm install typescript --save-dev

이 경우 개발에 Typescript (Javascript-parseable coding language)를 사용할 수 있지만 앱이 배포되면 모든 코드가 javascript로 변환되므로 더 이상 필요하지 않습니다. 따라서 게시 된 앱에 포함시키는 것은 의미가 없습니다. 실제로 공간 만 차지하고 다운로드 시간이 늘어납니다.


4
"$ npm install grunt --save-dev"도 개발에는 유용하지만 배포에는 유용하지 않기 때문에 마찬가지입니다.
Jackalope

1
참고 사항 : Microsoft는 devDependencies가 아닌 @ types / xxx 패키지를 종속성으로 설치하는 것이 좋습니다 github.com/Microsoft/types-publisher/issues/81
Dave

2
내가 혼란스럽게 생각하는 것은 이것이 어떻게 중요합니까? 를 사용하여 저장된 패키지 --save는 여전히 node_modules폴더 에만 저장됩니다 . 코드는 배포 된 웹 사이트에 포함되어 있지 않습니다.
Kokodoko

6
@Kokodoko --save-dev플래그 를 사용하면 패키지가 devDependencies객체에 추가됩니다 . 사람이 설치할 때 경우 / 당신의 패키지를, 모두는 dependencies다운로드 만은 devDependencies그들이 런타임에 필요하지 않기 때문에, 아니다. 답변에서 언급했듯이 시간과 공간이 절약됩니다. 패키지 파일 자체에서 작업하는 개발자 npm install는 패키지 디렉토리 내부를 실행하여 패키지 파일 을 설치할 수도 devDependencies있습니다.
Jasjit Singh Marwah

당신이 github의 입력에서의 repo를 다운로드 그래서 경우 npm install는이 devDependencies무시됩니다?
Kokodoko

41

예를 들어 보겠습니다.

  • 당신은 매우 SERIOUS npm 라이브러리 의 개발자입니다 . 다른 테스트 라이브러리를 사용하여 패키지를 테스트합니다.
  • 사용자가 라이브러리를 다운로드하여 코드에서 사용하려고합니다. 테스트 라이브러리도 다운로드해야합니까? 아마도 당신 jest은 테스트에 사용 하고 그들은 사용 mocha합니다. 설치 jest도 하시겠습니까? 그냥 라이브러리를 실행하려면?

권리 없다? 그래서 그들은에 devDependencies있습니다.

누군가가 할 npm i yourPackage경우 라이브러리를 실행하는 데 필요한 라이브러리 만 설치됩니다. 코드를 번들로 묶거나 테스트 및 조롱하는 데 사용한 다른 라이브러리는 라이브러리에 넣었으므로 설치되지 않습니다 devDependencies. 꽤 깔끔하지?

그래서, 개발자는 노출해야합니까 devDependancies를 ?

패키지가 오픈 소스 패키지이고 수백 명의 사람들이 패키지로 풀 요청을 보내고 있다고 가정 해 봅시다. 그러면 어떻게 패키지를 테스트할까요? 그들은 것이다 git clone당신의 repo를하고 그들이 할 것이다 때 의존성 뿐만 아니라 devDependencies을 . 그들은 당신의 패키지를 사용하지 않기 때문에. 패키지를 추가로 개발하고 있으므로 패키지를 테스트하려면 기존 테스트 사례를 통과하고 새로 작성해야합니다. 따라서 그들은 당신이 사용한 모든 테스트 / 빌딩 / 모의 라이브러리를 포함하는 것을 사용해야합니다.npm i
devDependencies


8
이 답변은 본질적으로 더 실용적이기 때문에 허용 된 답변과 최대 투표 수의 답변보다 훨씬 낫습니다. 감사!
잡히지 않는 예외

이것이 정답입니다. 다른 모든 답변은 왜 당신이 왜 다른 것을 사용하는지 설명하지 않습니다.
Rocky Kev

34

@ andreas-hultgren 제안한 대로이 답변npm 문서 에 따르면 :

누군가 자신의 프로그램에서 모듈을 다운로드하여 사용할 계획이라면 아마도 사용하는 외부 테스트 또는 문서 프레임 워크를 다운로드하거나 빌드하지 않아도됩니다.

그러나 웹 응용 프로그램 개발의 경우 Yeoman (다른 것들 중에서 피어 리뷰, 미리 작성된 package.json 파일을 설치하는 스캐 폴딩 도구)은 모든 패키지를 devDependencies에 배치하고 종속성에는 의존하지 않으므로 사용하는 --save-dev것이 안전한 내기 인 것처럼 보입니다. 에서 웹 애플리케이션 개발, 적어도.


3
gulp를 사용 --save-dev하고 패키지가 필요한 의존성을 설치하지 않는 패키지를 설치할 때 문제가 발생 했습니다. 실행 --save중 누락 된 종속성을 설치했습니다.
Nick M

18
또한 --savenpm 문서에 따라 테스트 및 문서 종속성을 제외한 모든 것을 사용 하고 있습니다. 위에서 언급 한 Yeoman 예제가 모범 사례의 좋은 예가 아니라고 생각하기 시작 했습니다.
wayfarer_boy

나도 그렇게 생각합니다. 왜 --save-dev여기에 모든 대답이 필요한지 명확 하지 않을 것입니다. :)
Kokodoko

20

--save-dev패키지 디스크립터 파일의 "devDependencies"배열에 semver 스펙을 --save저장하고 대신 "dependencies"에 저장합니다.


83
기능적 차이점은 무엇입니까?
ahnbizcad

6
이 답변은 나에게 가장 의미가 있습니다. devDependencies는 개발에는 필요하지만 프로덕션에는 필요하지 않으므로 htmllint, sass compilation 등 및 종속성은 실행 해야하는 Diaporama와 같은 프로덕션 요구 사항에 대한 것입니다.
고릴라 밀러

3
@ahnbizcad 여기서 더 잘 답변 되었지만 주요 기능상의 차이점은 devDependencies가 전 이적으로 포함되지 않는다는 것입니다.
Pace

아직 알지 못하는 사람을 위해 이것을 직관적으로 설명하는 가장 쉬운 방법은 아닌가? : Dev --save-dev는 패키지를 프로젝트의 --save로컬로 만드는 반면 패키지 는 노드 설치의 로컬로 만드는가?
ahnbizcad

9

명확한 답변이 이미 제공되었습니다. 그러나 devDependencies패키지 설치에 어떤 영향을 미치는지 언급 할 가치가 있습니다 .

기본적으로 npm install은 package.json에 종속성으로 나열된 모든 모듈을 설치합니다. --production 플래그 (또는 NODE_ENV 환경 변수가 production으로 설정된 경우)를 사용하면 npm은 devDependencies에 나열된 모듈을 설치하지 않습니다.

참조 : https://docs.npmjs.com/cli/install


8

일반적으로 개발 목적으로 만 사용하려는 것으로 제작 패키지를 늘리고 싶지 않습니다.

--save-dev(또는 -D) 옵션을 사용 하여 Unit Test 프레임 워크 (jest, jasmine, mocha, chai 등)와 같은 패키지를 분리하십시오.

앱에서 프로덕션에 필요한 다른 패키지는 --save(또는 -S)를 사용하여 설치해야합니다 .

npm install --save lodash       //prod dependency
npm install -S moment           // "       "
npm install -S opentracing      // "       "

npm install -D jest                 //dev only dependency
npm install --save-dev typescript   //dev only dependency

package.json파일을 열면 다음 항목이 두 개의 다른 섹션에 나열됩니다.

"dependencies": {
  "lodash": "4.x",
  "moment": "2.x",
  "opentracing": "^0.14.1"
},

"devDependencies": {
    "jest": "22.x",
    "typescript": "^2.8.3"
},

5

--save-dev 는 응용 프로그램 개발에 사용되는 모듈에 사용되며 프로덕션 환경에서 실행하는 동안 필요하지 않습니다. --save 는 package.json에 추가하는 데 사용되며 응용 프로그램 실행에 필요합니다.

예 : express, body-parser, lodash, helmet, mysql 모두 응용 프로그램 사용을 실행하는 동안 사용됩니다-의존성을두기 위해 저장하십시오. -종속성.

npm 링크 또는 npm 설치는 프로젝트 폴더에 종속 모듈과 함께 dev-dependency 모듈을 설치합니다


3

여기에있는 모든 설명은 훌륭하지만 매우 중요한 것은 없습니다. 프로덕션 종속성 만 어떻게 설치합니까? (개발 의존성없이). 우리는 분리 dependencies에서 devDependencies사용하여 --save--save-dev. 우리가 사용하는 모든 것을 설치하려면 :

npm i

프로덕션 패키지 만 설치하려면 다음을 사용해야합니다.

npm i --only=production

0

내 아이디어를 추가하고 싶습니다.

누군가가 직접 코드를 사용하는 대신 코드를 사용하면 모든 것이 다르게 나타날 것입니다

예를 들어,라는 HTTP 라이브러리를 작성합니다. node's request

도서관에서

lodash를 사용하여 문자열과 객체를 처리했습니다. lodash가 없으면 코드를 실행할 수 없습니다.

누군가가 자신의 코드의 일부로 HTTP 라이브러리를 사용하는 경우. 귀하의 코드는 그의 코드와 함께 컴파일됩니다.

당신이 넣어 필요 귀하의 코드는, lodash을 필요 dependencies컴파일


monaco-editor웹 편집기 인와 같은 프로젝트를 작성하면

모든 코드 product env library를 묶고 사용중인 웹 팩을 가지고 있으며 빌드가 완료되면monaco-min.js

사람이 경우가 없도록 여부 --save또는 --save-dependencies만 그는 IS 필요monaco-min.js

요약:

  1. 누군가 코드를 컴파일하려면 (라이브러리로 사용) lodash코드에서 사용한 코드를dependencies

  2. 누군가가 당신의 코드에 더 많은 기능을 추가하려는 경우, 그는 필요 unit test하고 compiler이들에 넣어,dev-dependencies


0

사람들은 프로덕션에서 npm을 사용하여 사악한 멋진 작업을 수행합니다. Node.js가 이에 대한 예이므로 모든 개발 도구를 실행하고 싶지는 않습니다.

gulp (또는 이와 유사한)를 사용하여 서버에 빌드 파일을 작성하는 경우 실제로 중요하지 않습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.