Використання npm для встановлення або оновлення необхідних пакунків, як пакет для rubygems


88

Я люблю Бандлера , він чудово справляється з управлінням залежностями. Я люблю npm , установка пакетів вузлів дуже проста! У мене є програма nodejs, і я хотів би мати можливість визначати залежності своїх програм і легко встановлювати / оновлювати їх там, де я розгортаю свою програму. Це не бібліотека, яку я випускаю, це повноцінний веб-додаток.

Мені відомо про npm bundleкоманду, але це, здається, просто замінює каталог, де встановлюються пакунки.

Я звик використовувати пакувач таким чином:

# Gemfile
gem "rails", "3.0.3"

Встановлює rails v3.0.3 та будь-які інші необхідні дорогоцінні камені на хост-машині, лише якщо їх ще немає

> bundle install

Як я можу досягти чогось подібного за допомогою npm?


моя відповідь не те, що ви хотіли знати?
Альфред

Відповіді:


147

Починаючи з npm 1.0 (що зараз ви отримуєте за замовчуванням, якщо дотримуєтесь кроків у файлі README), "bundle" більше не є розділеною річчю - це просто "як це працює".

Тому:

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

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

  4. require("express") і будь щасливим.

2
Під час виробництва я настійно рекомендую змінити локальний your_app/node_modulesкаталог на символічне посилання за межами каталогу вашого додатка. Вам не потрібно завантажувати, будувати та встановлювати кожну залежність кожного разу під час розгортання.
Даніель Бердслі

В порядку. що якщо я забуду оновити пакет.json? Чи є спосіб змусити NPM шукати не package.json, а пакунки, які я використовую у своєму коді?
Поно

4
Це не зовсім правильно. NPM встановить усі залежності для вищезазначеного my-projectв ./node_modules/my-project/node_modules. Я не впевнений, чи є зручний спосіб встановити всі залежності в ./node_modules Anyone?
Даніель Бердслі

@DanielBeardsley Я не думаю, що так працює npm. Якщо ви бачите таку поведінку та можете її відтворити, опублікуйте проблему на сторінці npm github.
isaacs

2
Погодьтеся з @DanielBeardsley. Я страждаю від такої поведінки навіть з npm 1.1.70
графіка

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')in deps / index.js просто імпортувати останню експрес-версію, і не обов’язково ту, яку ми встановили? Я nodeJS noob, тому будь ласка, терпіть зі мною.
adamJLev

Ні, це магія npm install, він додає символічні посилання в каталозі встановленого пакету до правильних версій залежних пакетів. Коли потрібен ваш пакет залежностей, require('express')спочатку перевіряє локальний каталог і знаходить символічне посилання на правильну версію express.
Даніель Бердслі

5

Вам слід прочитати ці дві статті з блогу 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 bundle install http://github.com/whoever/whatever/tarball/master Це встановить вміст цього tarball у набір, а потім ви можете внести його до списку залежностей, і він не намагатиметься встановити його, коли ваш пакет встановлюється.

Це також зручно, якщо у вас є власна вилка чогось, і ви не хотіли б змінювати назву.

Насправді ви можете запустити майже будь-яку команду npm у наборі. Щоб побачити, що всередині, ви можете зробити npm bundle ls. Щоб щось видалити, виконайте nm 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 з'явилася нова команда, 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/


2

Мені здається, що найпростішим рішенням є використання 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.


Я думаю, вам не слід цитувати trueі що це працює лише тому, що рядки є істинними значеннями (тобто, !!"false" === true).
Каміло Мартін

1

Також опублікуйте свій додаток npmі перелічіть його залежності у файлі package.json.

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

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


Так, але це веб-програма, що не є відкритим джерелом. Якщо у вас є ідея, яка не передбачає публікації програми, відредагуйте свою відповідь або створіть іншу.
Даніель Бердслі

1
Потім опублікуйте такий пакет, як "залежності myapp", який ваші користувачі можуть використовувати npmдля встановлення до встановлення вашого додатка. Я не думаю, що існує інший gemеквівалент для node.js.
Dan Grossman 02
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.