Rubygems için paketleyici gibi gerekli paketleri yüklemek veya güncellemek için npm kullanma


88

Bundler'ı seviyorum , bağımlılık yönetiminde harika. Npm'yi seviyorum , düğüm paketlerini kurmak çok kolay! Bir nodejs uygulamam var ve uygulama bağımlılıklarımı belirleyebilmeyi ve uygulamamı dağıttığım her yerde bunları kolayca yüklemeyi / güncellemeyi çok isterim . Bu yayınladığım bir kitaplık değil, tam teşekküllü bir web uygulaması.

npm bundleKomutun farkındayım , ancak bu sadece paketlerin kurulu olduğu dizini geçersiz kılıyor gibi görünüyor.

Bundler'ı bu şekilde kullanmaya alışkınım:

# Gemfile
gem "rails", "3.0.3"

Raylar v3.0.3'ü ve diğer gerekli mücevherleri ana makineye yalnızca zaten mevcut değilse yükler

> bundle install

Npm ile benzer bir şeyi nasıl başarabilirim?


cevabım bilmek istediğin şey değil mi?
Alfred

Yanıtlar:


148

Npm 1.0'dan itibaren (README dosyasındaki adımları izlerseniz artık varsayılan olarak elde edeceğiniz şeydir), "paket" artık ayrılmış bir şey değildir - sadece "nasıl çalıştığı" dır.

Yani:

  1. package.jsonProjenizin kök dizinine bir dosya koyun
  2. Depolarınızı bu dosyada listeleyin

    { "name" : "my-project"
    , "version" : "1.0.0"
    , "dependencies" : { "express" : "1.0.0" } }
    
  3. npm install Bunu bağımsız modda değil ve global modda aradığınız için, tüm depolarınızı yerel olarak kuracaktır.

  4. require("express") ve mutlu olmak.

2
Üretim sırasında, yerel your_app/node_modulesdizini uygulama dizininizin dışındaki bir sembolik bağlantıyla değiştirmenizi şiddetle tavsiye ederim . Her dağıtım yaptığınızda her bir bağımlılığı indirmek, oluşturmak ve kurmak zorunda kalmak istemezsiniz.
Daniel Beardsley

Tamam. package.json'umu güncellemeyi unutursam ne olur? NPM'yi package.json'u değil, kodumda kullandığım paketleri aramaya zorlamanın bir yolu var mı?
Pono

4
Bu tam olarak doğru değil. NPM Yukarıda için tüm bağımlılıklarını kuracak my-projectiçinde ./node_modules/my-project/node_modules. ./node_modules Herkesin tüm bağımlılıklarını yüklemesinin uygun bir yolu olup olmadığından emin değilim ?
Daniel Beardsley

@DanielBeardsley Npm'nin böyle çalıştığını sanmıyorum. Bu davranışı görüyorsanız ve onu yeniden üretebiliyorsanız, lütfen npm github sayfasına bir sorun gönderin.
isaacs

2
@DanielBeardsley ile katılıyorum. O davranıştan bile NPM 1.1.70 ile acı
graffic

10

Düzenleme: Bu yalnızca npm <1.0 sürümleri için geçerlidir


Bunu anlamak oldukça zordu ama NPM bunu mümkün kılıyor .

Üç bileşene ihtiyacınız var

  1. Deponuzdaki bir alt dizin (yani deps/)
  2. package.jsonBağımlılıkları listeleyen yukarıdaki dizinde bir dosya
  3. index.jsBağımlılıklarınızı gerektiren yukarıdaki dizinde bir dosya

Misal

Tek bağımlılığınızın ifade olduğunu hayal edin

deps / package.json

not: Bağımlılıkları her değiştirdiğinizde sürüm numarasını artırın

{
  "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
}

Artık bağımlılıklarınızı npm kullanarak kurabilmelisiniz. Hatta dağıtım sürecinizin bu bölümünü bile yapabilirsiniz

cd deps
npm install

Ardından, uygulama kodunuzun içinden aşağıdaki gibi belirli ekspres sürümünüze erişebilirsiniz:

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

Teşekkürler, bu şimdiye kadar gördüğüm en iyi yöntem. Ancak, require('express')in deps / index.js yalnızca en son ekspres sürümü içe aktarmaz mı ve bizim kurduğumuz sürümü zorunlu kılmaz mı? Ben bir nodeJS noob'um, bu yüzden lütfen bana katlanın.
adamJLev

Hayır, bu sihir, npm installkurulu paketinizin dizinine bağımlı paketlerin doğru sürümlerine sembolik bağlantılar ekler. Bağımlılıklar paketiniz gerektiğinde, önce require('express')yerel dizini kontrol eder ve express'in doğru sürümüne yönelik sembolik bağlantıyı bulur.
Daniel Beardsley

5

Bu iki makaleyi Isaacs (yazar npm) blogundan okumalısınız. Gerçekten iyi olduklarını düşünüyorum ve size hedefinize nasıl ulaşacağınızı söyleyeceğine inanıyorum:

  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 numaralı bağlantının (11. nokta) bunu açıkladığına inanıyorum:

11: Tüm bağımlılıklarınızı paketin kendisine toplayın

Npm bundle komutunu kullandığınızda, npm tüm bağımlılıklarınızı paketinizdeki node_modules klasörüne koyacaktır. Ama burada bitmiyor.

Kayıt defterinde olmayan bir şeye güvenmek istiyorsanız, bunu yapabilirsiniz. Sadece şunu yap:

npm bundle install http://github.com/whoever/whatever/tarball/master Bu, o tarball içeriğini pakete yükler ve ardından onu bir bağımlılık olarak listeleyebilirsiniz ve ne zaman yüklemeye çalışmaz? paketiniz kurulur.

Bu, kendi çatalınız varsa ve adını değiştirmemeyi tercih ediyorsanız da kullanışlıdır.

Aslında, paketteki hemen hemen her npm komutunu çalıştırabilirsiniz. İçinde ne olduğunu görmek için npm paket ls yapabilirsiniz. Bir şeyi kaldırmak için npm bundle rm işlemi yapın. Ve tabii ki birden fazla sürüm kurabilir ve istediğinizi etkinleştirebilirsiniz.


Bu yararlı, ancak aradığım şey bu değildi. Belki de açıklama eklemem gerekiyor. NPM paketlerini otomatik olarak yüklemenin veya güncellemenin (hedef makinede) bir yolunu arıyorum. Görünüşe göre npm bundletüm bağımlılıklarınızı varsayılandan farklı bir dizine toplamak için kullanılıyor. Muhtemelen bundle install( bundlerRuby için) benzer şekilde performans gösteren kendi çözümümü bulacağım
Daniel Beardsley

1
npm1.0+ sürümünden itibaren yalnızca bir not npm bundlekaldırıldı. Bunun yerine, npm installpaket adı olmayan komutu kullanın , bu, package.json dosyasını okuyacak ve gerekli paketleri indirecektir.
Arthur Maltson

2

Npm 1.1.2 sürümünden itibaren , benzer npm shrinkwrapbir npm-shrinkwrapped.jsondosya oluşturan yeni bir komut vardır Gemfile.lock. Yazılımın çürümesini önlemek için bir tane yapmak önemlidir ( Bundler'ın gerekçesine bakın ). Özellikle Nodejs çok hızlı hareket eden bir topluluğa sahip olduğu için.

İken bundle installbir oluşturur Gemfile.lockotomatik olarak npm installoluşturmaz npm-shrinkwrapped.json(ama vardır ne zaman kullanacağız). Bu nedenle kullanmayı hatırlamanız gerekir npm shrinkwrap.

Http://blog.nodejs.org/2012/02/27/managing-node-js-dependencies-with-shrinkwrap/ adresinde tam bir kılavuz okuyun


2

Bana öyle geliyor ki en basit çözüm bayrağı (geçen ay npm'ye eklendi) olarak ayarlanmış bir package.jsondosya kullanmaktır . Bu şekilde, projenizin bağımlılıklarını çalıştırabilir veya ele geçirebilirsiniz , ancak herhangi birinin yanlışlıkla kamuya açık olmayan projenizi yayınlamasını engellersiniz.privatetruenpm installnpm bundle

İşte bir örnek package.json:

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

Halihazırda mevcut değilse çalıştırmak yerel sisteme npm installyüklenecektir express; koşu npm publishyüzünden bir hata veriyor "private": true.

Siz ve ekibiniz, zaman içindeki bağımlılık değişikliklerini izlemek için dahili olarak sürüm etiketini kullanabilirsiniz. Bir bağımlılığı her değiştirdiğinizde, sürümü çarpın. Hangi sürümü yüklediğinizi görmek için kullanın npm ls installed.


Bence alıntı yapmamalısın trueve bu sadece dizeler doğru değerler olduğu için işe yarıyor (yani, !!"false" === true).
Camilo Martin

1

Uygulamanızı ile npmde yayınlayın ve bağımlılıklarını package.json dosyanızda listeleyin.

Biri npmpaketinizi yüklemek için kullandığında npm, bağımlılıklarını çözmekle ilgilenecektir.

Paket özellikleri: http://wiki.commonjs.org/wiki/Packages/1.0


Evet, ama bu açık kaynaklı olmayan bir web uygulaması. Uygulamayı yayınlamayı içermeyen bir fikriniz varsa, lütfen cevabınızı düzenleyin veya başka bir tane oluşturun.
Daniel Beardsley

1
Ardından, kullanıcılarınızın npmuygulamanızı yüklemeden önce yüklemek için kullanabilecekleri "uygulamam bağımlılıkları" gibi bir paket yayınlayın . gemNode.js için başka bir eşdeğer olduğunu sanmıyorum.
Dan Grossman
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.