Использование npm для установки или обновления необходимых пакетов, как bundler для rubygems - PullRequest
86 голосов
/ 02 февраля 2011

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

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

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

# Gemfile
gem "rails", "3.0.3"

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

> bundle install

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

Ответы [ 6 ]

144 голосов
/ 17 мая 2011

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

Итак:

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

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

  4. require("express") и будет счастлив.
10 голосов
/ 13 марта 2011

Редактировать: Это относится только к версиям npm <1.0 </h2> Это было довольно сложно понять, но NPM делает это возможным . Вынужно три компонента Подкаталог в вашем хранилище (т.е. deps/) Файл package.json в указанном выше каталоге, в котором перечислены зависимости An 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;
5 голосов
/ 02 февраля 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 вещь. И, конечно же, вы можете установить несколько версий и активировать одну ты хочешь.

2 голосов
/ 20 февраля 2013

Начиная с версии 1.1.2 Npm, появилась новая команда 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/

2 голосов
/ 30 марта 2011

Мне кажется, что самое простое решение - использовать файл 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.

1 голос
/ 02 февраля 2011

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...