npm을 사용하여 rubygems 용 번 들러처럼 필수 패키지를 설치하거나 업데이트합니다.


88

나는 Bundler를 좋아하며 의존성 관리에 탁월합니다. 나는 npm을 좋아 합니다. 노드 패키지를 설치하는 것은 쉽습니다! 저는 nodejs 앱을 가지고 있으며 앱 종속성을 지정하고 앱을 배포 때마다 쉽게 설치 / 업데이트 할 수 있기를 바랍니다 . 이것은 내가 공개하는 라이브러리가 아니라 본격적인 웹 앱입니다.

나는 npm bundle명령을 알고 있지만 패키지가 설치된 디렉토리를 단순히 무시하는 것 같습니다.

나는 이러한 방식으로 번 들러를 사용하는 데 익숙합니다.

# Gemfile
gem "rails", "3.0.3"

Rails v3.0.3 및 기타 필수 gem이 아직없는 경우에만 호스트 컴퓨터에 설치합니다.

> bundle install

npm으로 비슷한 것을 어떻게 얻을 수 있습니까?


내 대답은 당신이 알고 싶어했던 것이 아닙니까?
Alfred

답변:


147

npm 1.0 (README 파일의 단계를 따르면 기본적으로 제공됨)에서 "번들"은 더 이상 분리 된 것이 아닙니다. 단지 "작동 방식"입니다.

그래서:

  1. package.json프로젝트의 루트에 파일을 넣으십시오.
  2. 해당 파일에 귀하의 부서를 나열하십시오.

    { "name" : "my-project"
    , "version" : "1.0.0"
    , "dependencies" : { "express" : "1.0.0" } }
    
  3. npm install 전역 모드가 아닌 인수없이 이것을 호출하기 때문에 모든 deps를 로컬로 설치합니다.

  4. require("express") 행복하세요.

2
프로덕션에서는 로컬 your_app/node_modules디렉터리를 앱 디렉터리 외부의 심볼릭 링크로 변경하는 것이 좋습니다 . 배포 할 때마다 각 종속성을 다운로드, 빌드 및 설치할 필요가 없습니다.
Daniel Beardsley 2011-06-22

확인. 내 package.json을 업데이트하는 것을 잊은 경우 어떻게합니까? NPM이 package.json이 아니라 내 코드에서 사용중인 패키지를 찾도록 강제하는 방법이 있습니까?
Pono 2013-09-13

4
이것은 정확하지 않습니다. NPM은 위의 모든 종속성을 설치합니다 my-project에서 ./node_modules/my-project/node_modules. ./node_modules Anyone에 모든 종속성을 설치하는 편리한 방법이 있는지 잘 모르겠습니다 .
Daniel Beardsley

@DanielBeardsley 나는 그것이 npm이 작동하는 방식이라고 생각하지 않습니다. 그 동작을보고 재현 할 수 있다면 npm github 페이지에 문제를 게시하십시오.
이삭

2
@DanielBeardsley와 동의하십시오. 나는 npm 1.1.70에서도 그 행동으로 고통받습니다
graffic 2013 년

10

편집 : 이것은 npm 버전 <1.0에만 적용됩니다.


이것을 알아내는 것은 매우 어려웠지만 NPM은 이것을 가능하게합니다 .

세 가지 구성 요소가 필요합니다

  1. 저장소의 하위 디렉토리 (예 : deps/ )
  2. package.json종속성을 나열하는 위 디렉토리 파일
  3. index.js종속성이 필요한 위 디렉토리 의 파일

표현 이 유일한 의존 이라고 상상해보십시오.

deps / package.json

참고 : 종속성을 수정할 때마다 버전 번호를 늘립니다.

{
  "name": "myapp_dependencies",
  "version": "0.0.1",
  "engines": {
    "node": "0.4.1"
  },
  "dependencies":{
    "express": "2.0.0beta2"
  }
}

deps / index.js

export.modules = {
  express: require('express')
  //add more
}

이제 npm을 사용하여 종속성을 설치할 수 있습니다. 이 부분을 배포 프로세스의 일부로 만들 수도 있습니다.

cd deps
npm install

그런 다음 앱 코드 내에서 다음과 같이 특정 버전의 Express에 액세스 할 수 있습니다.

var express = require('myapp_dependencies').express;

감사합니다. 이것이 제가 지금까지 본 것 중 가장 좋은 방법입니다. 그러나 require('express')deps / index.js는 최신 익스프레스 버전을 가져 오지 않고 반드시 우리가 설치 한 버전을 가져 오지 않을까요? 나는 nodeJS 멍청이이므로 저를 참아주세요.
adamJLev 2011

아니요, 이것이의 마술입니다 npm install. 설치된 패키지의 디렉토리 내에 심볼릭 링크를 올바른 버전의 종속 패키지에 추가합니다. 종속성 패키지가 필요한 경우 require('express')는 먼저 로컬 디렉토리를 확인하고 올바른 버전의 express에 대한 심볼릭 링크를 찾습니다.
Daniel Beardsley 2011-06-22

5

Isaacs (author npm) 블로그에서이 두 기사를 읽어야합니다. 나는 그들이 정말 훌륭하다고 생각하며 목표를 달성하는 방법을 알려줍니다.

  1. http://blog.izs.me/post/1675072029/10-cool-things-you-probably-didnt-realize-npm-could-do
  2. http://foohack.com/2010/08/intro-to-npm/

나는 링크 # 1 (포인트 # 11)이 이것을 설명한다고 믿는다.

11 : 모든 종속성을 패키지 자체에 번들링

npm bundle 명령을 사용할 때 npm은 모든 종속성을 패키지의 node_modules 폴더에 저장합니다. 하지만 여기서 멈추지 않습니다.

레지스트리에없는 것에 의존하고 싶다면 그렇게 할 수 있습니다. 다음과 같이하십시오.

npm bundle install http://github.com/whoever/whatever/tarball/master 그러면 해당 tarball의 내용이 번들에 설치 되고 종속성으로 나열 할 수 있으며 다음과 같은 경우에는 설치를 시도하지 않습니다. 패키지가 설치됩니다.

이것은 또한 자신의 포크가 있고 이름을 변경하지 않으려는 경우에도 유용합니다.

실제로 번들에서 거의 모든 npm 명령을 실행할 수 있습니다. 내부 내용을 보려면 npm bundle ls를 수행하면됩니다. 무언가를 제거하려면 npm bundle rm 일을 수행하십시오. 물론 여러 버전을 설치하고 원하는 버전을 활성화 할 수 있습니다.


이것은 내가 찾고 있던 것이 아니지만 유용합니다. 설명을 추가해야 할 수도 있습니다. 앱을 배포 할 때마다 내 앱이 의존하는 NPM 패키지를 대상 컴퓨터에서 자동으로 설치하거나 업데이트하는 방법을 찾고 있습니다. npm bundle기본값이 아닌 특정 디렉토리에 모든 종속성을 수집하는 데 사용되는 것 같습니다 . 나는 아마 내 자신의 솔루션을 가지고 올 것이다 그 유사에 수행 bundle install( bundler루비)
다니엘 비어 즐리

1
npm버전 1.0 이상 부터는 메모 만 npm bundle제거되었습니다. 대신 npm install패키지 이름없이 명령을 사용하면 package.json을 읽고 필요한 패키지를 가져옵니다.
Arthur Maltson

2

Npm 버전 1.1.2부터 .NET 과 유사한 파일 npm shrinkwrap을 생성하는 새로운 명령 이 있습니다. 소프트웨어 부패를 방지하기 위해 하나를 만드는 것이 중요합니다 ( Bundler의 이론적 근거 참조).npm-shrinkwrapped.jsonGemfile.lock ). 특히 Nodejs는 빠르게 움직이는 커뮤니티를 가지고 있습니다.

자동으로 bundle install생성하는 동안 생성 하지 않습니다 (존재할 때 사용합니다). 따라서 사용하는 것을 기억해야합니다.Gemfile.locknpm installnpm-shrinkwrapped.jsonnpm shrinkwrap .

http://blog.nodejs.org/2012/02/27/managing-node-js-dependencies-with-shrinkwrap/ 에서 전체 가이드 읽기


2

가장 간단한 해결책은 플래그 (지난 달에 npm에 추가됨)가으로 설정된 package.json파일 을 사용하는 것 같습니다 . 그런 식으로 실행 하거나privatetruenpm installnpm bundle 프로젝트의 종속성을 있지만 다른 사람이 실수로 비공개 프로젝트를 게시하는 것을 방지 할 수 있습니다.

예를 들면 다음과 같습니다 package.json.

{
"name": "yourProject"
,"version": "1.0.0"
,"dependencies": { "express" : ">=2.1.0" }
,"private": true
}

실행 npm installexpress아직 존재하지 않는 경우 로컬 시스템에 설치 됩니다. 실행 npm publish하면 오류가 발생합니다."private": true .

사용자와 팀은 내부적으로 버전 태그를 사용하여 시간 경과에 따른 종속성 변경을 추적 할 수 있습니다. 종속성을 변경할 때마다 버전을 올릴 수 있습니다. 설치 한 버전을 확인하려면 npm ls installed.


나는 당신이 인용해서는 안되며 true문자열이 진실한 값이기 때문에 작동 한다고 생각 합니다 (즉, !!"false" === true).
Camilo Martin

1

앱 게시 npm 하고 package.json 파일에 종속성을 나열합니다.

누군가가 npm패키지를 설치 하는 데 사용하면npm 종속성을 해결합니다.

패키지 사양 : http://wiki.commonjs.org/wiki/Packages/1.0


예,하지만 이것은 비 오픈 소스 웹 앱입니다. 앱 게시와 관련이없는 아이디어가있는 경우 답변을 수정하거나 다른 답변을 만드십시오.
Daniel Beardsley

1
그런 다음 사용자가 npm앱을 설치하기 전에 설치하는 데 사용할 수있는 "myapp-dependencies"와 같은 패키지를 게시합니다 . gemnode.js에 상응 하는 다른 것은 없다고 생각합니다.
Dan Grossman
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.