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

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

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

Я использую bundler таким образом:

# Gemfile
gem "rails", "3.0.3"

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

> bundle install

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

Ответ 1

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

Итак:

  • Поместите файл package.json в корень вашего проекта
  • Список ваших отпечатков в этом файле

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

  • require("express") и будьте счастливы.

Ответ 2

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


Было сложно понять это, но NPM делает это возможным.

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

  • Подкаталог в вашем репозитории (т.е. deps/)
  • Файл package.json в приведенном выше каталоге, в котором перечислены зависимости
  • Файл 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

Затем в коде приложения вы можете получить доступ к вашей конкретной версии выражения следующим образом:

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

Ответ 3

Вы должны прочитать эти две статьи из блога Isaacs (author npm). Я думаю, что они действительно хороши, и я верю, что расскажу вам, как достичь своей цели:

Я считаю, что ссылка # 1 (точка № 11) объясняет это:

11: Свяжите все ваши зависимости в самом пакете

Когда вы используете команда npm bundle, npm поместит все ваши зависимости в node_modules в вашем пакете. Но он не останавливается на достигнутом.

Если вы хотите зависеть от чего-то это не в реестре, вы можете сделать что. Просто сделайте следующее:

Установка пакета npm http://github.com/whoever/whatever/tarball/masterЭто установит содержимое этого tarball в комплект, а затем вы может перечислить его как зависимость, и это не пытайтесь установить его, когда ваш пакет устанавливается.

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

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

Ответ 4

Мне кажется, что самым простым решением является использование файла package.json с флагом private (добавленным к номеру в минуту только в прошлом месяце), установленным в 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.

Ответ 5

В версии Npm версии 1.1.2 появилась новая команда npm shrinkwrap, которая создает файл npm-shrinkwrapped.json, аналогичный Gemfile.lock, Важно сделать это, чтобы предотвратить сбой программного обеспечения (см. Объяснение Бундлера). В частности, у 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/

Ответ 6

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

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

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