Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: Daniel BeardsleyОтветов: 6

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

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

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

# Gemfile
gem "rails", "3.0.3"

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

> bundle install

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

  • мой ответ не то, что вы хотели знать? Alfred 05.02.2011

dependenciesnpmbundlerjavascript

Ответы

Ответ 1 · рейтинг 148 · isaacs

Начиная с 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") и будь счастлив.

Ответ 2 · рейтинг 10 · Daniel Beardsley

Изменить: это относится только к версиям 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;

Ответ 3 · рейтинг 5 · Alfred

Вам следует прочитать эти две статьи из блога 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. И, конечно же, вы можете установить несколько версий и активировать ту, которая вам нужна.

Ответ 4 · рейтинг 2 · Colonel Panic

Начиная с версии 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/

Ответ 5 · рейтинг 2 · Trevor Burnham

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

Ответ 6 · рейтинг 1 · Dan Grossman

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

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

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

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы