Использование npm для установки или обновления необходимых пакетов точно так же, как Bundler для rubygems

Мне нравится Bundler, он отлично справляется с управлением зависимостями. Мне нравится npm, устанавливать пакеты узлов очень просто! У меня есть приложение nodejs, и я хотел бы иметь возможность указывать зависимости моих приложений и легко устанавливать / обновлять их, где бы я ни развертывал свое приложение. Это не библиотека, которую я выпускаю, это полноценное веб-приложение.

Мне известна команда npm bundle, но она просто переопределяет каталог, в котором установлены пакеты.

Я привык использовать упаковщик таким образом:

# Gemfile
gem "rails", "3.0.3"

Устанавливает рельсы v3.0.3 и любые другие необходимые драгоценные камни на хост-машину, только если они еще не существуют

> bundle install

Как добиться чего-то подобного с помощью npm?


person Daniel Beardsley    schedule 02.02.2011    source источник
comment
мой ответ не то, что вы хотели знать?   -  person Alfred    schedule 05.02.2011


Ответы (6)


Начиная с npm 1.0 (который теперь вы получаете по умолчанию, если следуете инструкциям в файле README), «пакет» больше не является изолированной вещью - это просто «как это работает».

So:

  1. Поместите package.json файл в корень вашего проекта
  2. Перечислите свои данные в этом файле

    { "name" : "my-project"
    , "version" : "1.0.0"
    , "dependencies" : { "express" : "1.0.0" } }
    
  3. npm install Поскольку вы вызываете это без аргументов и не в глобальном режиме, он просто установит все ваши депы локально.

  4. require("express") и будь счастлив.
person isaacs    schedule 16.05.2011
comment
При производстве я настоятельно рекомендую изменить локальный каталог your_app/node_modules на символическую ссылку вне каталога вашего приложения. Вам не нужно загружать, собирать и устанавливать каждую зависимость при каждом развертывании. - person Daniel Beardsley; 22.06.2011
comment
Ok. что, если я забуду обновить свой package.json? Есть ли способ заставить NPM искать не package.json, а пакеты, которые я использую в своем коде? - person Pono; 13.09.2011
comment
Это не совсем так. NPM установит все зависимости для вышеуказанного my-project в ./node_modules/my-project/node_modules. Я не уверен, есть ли удобный способ установить все зависимости в ./node_modules Anyone? - person Daniel Beardsley; 28.11.2011
comment
@DanielBeardsley Я не думаю, что так работает npm. Если вы наблюдаете такое поведение и можете воспроизвести его, опубликуйте сообщение о проблеме на странице npm github. - person isaacs; 13.12.2011
comment
О, я думаю, нет \ n в ТАК комментариях. Что касается другой проблемы, я рекомендую проверить папку node_modules в git и не использовать npm install как часть развертывания. npm rebuild может повторно компилировать двоичные файлы deps. @Pono - Нет, npm не читает ваш код или ваши мысли. Он строго выполняет то, что вы указываете в package.json, конфигах и командах cli. :) - person isaacs; 13.12.2011
comment
Согласитесь с @DanielBeardsley. Я страдаю от такого поведения даже с npm 1.1.70 - person graffic; 08.01.2013

Изменить: это относится только к версиям npm ‹1.0


Разобраться в этом было довольно сложно, но NPM делает это возможным.

Вам нужно три компонента

  1. Подкаталог в вашем репозитории (т.е. deps/)
  2. Файл package.json в указанном выше каталоге, в котором перечислены зависимости
  3. Файл index.js в указанном выше каталоге, для которого требуются ваши зависимости

Пример

Представьте, что express - это ваша единственная зависимость

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;
person Daniel Beardsley    schedule 13.03.2011
comment
Спасибо, это лучший метод, который я когда-либо видел. Однако не будет ли require('express') в deps / index.js просто импортировать последнюю экспресс-версию, и не обязательно ту, которую мы установили? Я новичок в NodeJS, так что терпите меня. - person adamJLev; 09.04.2011
comment
Нет, это волшебство npm install, он добавляет символические ссылки в каталог вашего установленного пакета на правильные версии зависимых пакетов. Когда требуется ваш пакет зависимостей, require('express') сначала проверяет локальный каталог и находит символическую ссылку на правильную версию express. - person Daniel Beardsley; 22.06.2011

Вам следует прочитать эти две статьи из блога Isaacs (автор 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 установить http://github.com/whoever/whatever/tarball/master Это установит содержимое этого архива в пакет, а затем вы сможете указать его как зависимость, и он не будет пытаться установить его, когда ваш пакет будет установлен.

Это также удобно, если у вас есть собственный форк чего-либо, и вы предпочитаете не менять имя.

Фактически, вы можете запустить практически любую команду npm в пакете. Чтобы увидеть, что внутри, вы можете выполнить команду npm bundle ls. Чтобы что-то удалить, выполните npm bundle rm thing. И, конечно же, вы можете установить несколько версий и активировать ту, которая вам нужна.

person Alfred    schedule 02.02.2011
comment
Это полезно, хотя это было не то, что я искал. Возможно, мне нужно добавить пояснение. Я ищу способ автоматической установки или обновления (на конечном компьютере) пакетов NPM, от которых зависит мое приложение при его развертывании. Похоже, что npm bundle используется для сбора всех ваших зависимостей в определенный каталог, отличный от каталога по умолчанию. Вероятно, я предложу свое собственное решение, которое работает аналогично bundle install (bundler для рубина) - person Daniel Beardsley; 07.02.2011
comment
Замечу, что, начиная с npm версии 1.0+, npm bundle был удален. Вместо этого просто используйте команду npm install без имени пакета, она прочитает package.json и загрузит необходимые пакеты. - person Arthur Maltson; 26.05.2011

Начиная с версии Npm 1.1.2, есть новая команда npm shrinkwrap, которая создает npm-shrinkwrapped.json файл, аналогичный Gemfile.lock. Его важно создать, чтобы предотвратить гниение программного обеспечения (см. обоснование Bundler). Тем более, что у Nodejs очень быстро развивающееся сообщество.

В то время как bundle install создает Gemfile.lock автоматически, npm install не будет создавать npm-shrinkwrapped.json (но будет использовать его, если он существует). Следовательно, вам нужно не забыть использовать npm shrinkwrap.

Прочтите полное руководство на странице http://blog.nodejs.org/2012/02/27/managing-node-js-dependencies-with-shrinkwrap/

person Colonel Panic    schedule 20.02.2013

Мне кажется, что самое простое решение - использовать файл package.json с флагом private (добавленным в npm только в прошлом месяце), установленным на true. Таким образом, вы можете запустить npm install или npm bundle, чтобы получить зависимости вашего проекта, но вы предотвратите случайную публикацию вашего закрытого проекта кем-либо.

Вот пример package.json:

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

Запуск npm install установит express в локальной системе, если она еще не существует; запуск npm publish дает ошибку из-за "private": true.

Вы и ваша команда можете использовать тег версии для внутреннего использования, чтобы отслеживать изменения зависимостей с течением времени - каждый раз, когда вы меняете зависимость, повышайте версию. Чтобы узнать, какую версию вы установили, используйте npm ls installed.

person Trevor Burnham    schedule 30.03.2011
comment
Я думаю, вы не должны цитировать true, и что он работает только потому, что строки являются истинными значениями (то есть !!"false" === true). - person Camilo Martin; 20.07.2014

Также опубликуйте приложение с npm и укажите его зависимости в файле package.json.

Когда кто-то использует npm для установки вашего пакета, npm позаботится об устранении его зависимостей.

Спецификация пакетов: http://wiki.commonjs.org/wiki/Packages/1.0

person Dan Grossman    schedule 02.02.2011
comment
Да, но это веб-приложение без открытого исходного кода. Если у вас есть идея, которая не связана с публикацией приложения, отредактируйте свой ответ или создайте другой. - person Daniel Beardsley; 02.02.2011
comment
Затем опубликуйте пакет, например myapp-dependencies, который ваши пользователи могут использовать npm для установки перед установкой вашего приложения. Я не думаю, что есть другой gem эквивалент для node.js. - person Dan Grossman; 02.02.2011