Heroku'da bir node.js uygulaması oluştururken gitmek için node_modules'ü kontrol etmeli miyim?


368

Heroku'da node.js için temel başlangıç ​​talimatlarını burada izledim:

https://devcenter.heroku.com/categories/nodejs

Bu talimatlar bir .gitignore node_modules oluşturmanızı söylemez ve bu nedenle node_modules'ün git'e işaretlenmesi gerektiğini gösterir. Git'e node_modules eklediğimde, başlangıç ​​uygulamam doğru şekilde çalıştı.

Ben daha gelişmiş bir örnek takip zaman:

https://devcenter.heroku.com/articles/realtime-polyglot-app-node-ruby-mongodb-socketio https://github.com/mongolab/tractorpush-server (kaynak)

Bana .gitignore'a node_modules eklemem talimatı verdi. Böylece node_modules'ü git'ten kaldırdım, .gitignore'a ekledim, sonra yeniden konuşlandırdım. Bu sefer konuşlandırılan şu şekilde başarısız oldu:

-----> Heroku receiving push
-----> Node.js app detected
-----> Resolving engine versions
       Using Node.js version: 0.8.2
       Using npm version: 1.0.106
-----> Fetching Node.js binaries
-----> Vendoring node into slug
-----> Installing dependencies with npm
       Error: npm doesn't work with node v0.8.2
       Required: node@0.4 || 0.5 || 0.6
           at /tmp/node-npm-5iGk/bin/npm-cli.js:57:23
           at Object.<anonymous> (/tmp/node-npm-5iGk/bin/npm-cli.js:77:3)
           at Module._compile (module.js:449:26)
           at Object.Module._extensions..js (module.js:467:10)
           at Module.load (module.js:356:32)
           at Function.Module._load (module.js:312:12)
           at Module.require (module.js:362:17)
           at require (module.js:378:17)
           at Object.<anonymous> (/tmp/node-npm-5iGk/cli.js:2:1)
           at Module._compile (module.js:449:26)
       Error: npm doesn't work with node v0.8.2
       Required: node@0.4 || 0.5 || 0.6
           at /tmp/node-npm-5iGk/bin/npm-cli.js:57:23
           at Object.<anonymous> (/tmp/node-npm-5iGk/bin/npm-cli.js:77:3)
           at Module._compile (module.js:449:26)
           at Object.Module._extensions..js (module.js:467:10)
           at Module.load (module.js:356:32)
           at Function.Module._load (module.js:312:12)
           at Module.require (module.js:362:17)
           at require (module.js:378:17)
           at Object.<anonymous> (/tmp/node-npm-5iGk/cli.js:2:1)
           at Module._compile (module.js:449:26)
       Dependencies installed
-----> Discovering process types
       Procfile declares types -> mongod, redis, web
-----> Compiled slug size is 5.0MB
-----> Launching... done, v9

"Heroku ps" çalıştırmak kazayı doğrular. Tamam, sorun değil, bu yüzden değişikliği geri aldım, git deposuna node_module'u geri ekledim ve .gitignore'dan kaldırdım. Ancak, geri döndükten sonra bile, dağıtımda hala aynı hata iletisini alıyorum, ancak şimdi uygulama tekrar düzgün çalışıyor. "Heroku ps" çalıştırmak uygulamanın çalıştığını söylüyor.

Benim sorum, bunu yapmanın doğru yolu nedir? Node_modules dahil edilsin mi? Geri döndüğümde neden hala hata mesajı alıyorum? Benim tahminim git deposu Heroku tarafında kötü durumda mı?


10
Heroku'da Düğüm dili sahibiyim ve cevap basit: Hayır node_modules. Heroku uygulamalarına giriş yapmayın.
hunterloftis

@hunterloftis 'node_modules in ' veya 'node_modules in into ' seçeneğini işaretlemeyin mi? Heroku'daki Düğüm dili sahibi olarak, node_modüllerimizin tamamını git push'umuz aracılığıyla yüklememizi ister misiniz? Bant genişliği israfı ve Heroku'nun onları git push'umun arka ucuna getirmesi nedeniyle tercih etmem; Ancak, Heroku'nun uygulamamı yüklemesini sağlamak için node_modules'imdeki dosyaları manuel olarak düzenlemek zorunda kaldım. Bu nedenle çalışmak için düzenlenmiş dosyamı içeren tüm modülü eksi node_modules göz ardı etmek zorunda kaldı.
ZStoneDPM

Yanıtlar:


400

İkinci Güncelleme

SSS artık mevcut değil.

Aşağıdakilerin dokümantasyonundan shrinkwrap:

Bir pakette bulunan belirli baytları kilitlemek istiyorsanız, örneğin bir dağıtımı veya derlemeyi yeniden üretme konusunda% 100 güvene sahip olmak istiyorsanız, kaynak denetimine bağımlılıklarınızı kontrol etmeli veya doğrulayabilecek başka bir mekanizma izlemelisiniz. sürümler yerine içerik.

Shannon ve Steven bundan daha önce bahsetmişlerdi ama bence bu kabul edilen cevabın bir parçası olmalı.


Güncelleme

Aşağıdaki öneri için listelenen kaynak güncellendi . Artık node_modulesklasörün işlenmesini önermiyorlar .

Genellikle hayır. Npm'nin paketleriniz için bağımlılıkları çözmesine izin verin.

Web siteleri ve uygulamalar gibi dağıttığınız paketler için tam bağımlılık ağacınızı kilitlemek için npm shrinkwrap kullanmalısınız:

https://docs.npmjs.com/cli/shrinkwrap


Orijinal Mesaj

Referans olarak, npm SSS sorunuzu açıkça cevaplıyor:

Web siteleri ve uygulamalar gibi dağıttığınız şeyler için node_modules'u git'e bakın. Yeniden kullanılması amaçlanan kütüphaneler ve modüller için node_modules'ü git'e kontrol etmeyin. Geliştirme ortamınızdaki bağımlılıkları yönetmek için npm'yi kullanın, ancak dağıtım komut dosyalarınızda kullanmayın.

ve bunun için iyi bir gerekçe için, Mikeal Rogers'ın bu konudaki yazısını okuyun .


Kaynak: https://docs.npmjs.com/misc/faq#should-i-check-my-node-modules-folder-into-git


13
Bu doğru değil - aslında çok kötü bir fikir. Windows üzerinde geliştiriyor ve sonra Linux'ta dağıtıyorsanız, dağıtırken node_modules'ü yeniden oluşturmanız gerekir. Bu demektir ki - kaos. Çok sayıda değiştirilmiş dosya ve ne yapacağımı bilmiyorum.
user3690202

8
Bu mümkün değil - bazı geliştiricilerimiz hedefleme pencereleri, diğerleri linux'u hedefliyor, ancak aynı kod tabanını geliştiriyor. En iyi yaklaşım, düğüm modüllerini işlememektir - ayy.
user3690202

7
@ user3690202 Normalden ziyade alışılmadık bir durumunuz var gibi görünüyor, bu yüzden "bu doğru değil" demek muhtemelen abartılıdır. Bunu söyledikten sonra, tam kullanım durumunuzun ne olduğundan emin değilim, ancak geliştirme için hem pencereleri hem de linux'u kullanmak için herhangi bir neden düşünemiyorum. Birine sadık kalın ve desteğinizin tüm platformlarında testler veya KG yapın.
Kostia

16
@Kostia Kullanım durumumuz oldukça yaygın. Biz gönüllüiz ve şirket makinelerini değil, kendi makinelerimizi kullanıyoruz. Açık kaynak için oldukça yaygın bir durum gibi görünüyor.
Adam

4
@Adam teğetsel olarak, derlenen dosyaları ekleyebilir misiniz .gitignore? Bu şekilde, kaynak git'tedir ve derlenmiş bileşenler, homurdanma ve yutulma projelerinde klasörlerin nasıl distveya nasıl yönlendirildiğine benzer şekilde değildir output.
Kostia

160

Benim en büyük endişe değil kontrol node_modulesGİT'e yolda 10 yıl, üretim, uygulama hâlâ kullanılıyor iken, npm etrafında olmayabilir olmasıdır. Veya npm bozulabilir; veya koruyucular güvendiğiniz kütüphaneyi depolarından kaldırmaya karar verebilir; veya kullandığınız sürüm kırpılmış olabilir.

Bu, maven gibi repo yöneticileri ile hafifletilebilir, çünkü kullandığınız paketlerle bir ayna korumak için her zaman kendi yerel Nexus veya Artifactory'nizi kullanabilirsiniz. Anladığım kadarıyla böyle bir sistem npm için mevcut değil. Aynı şey Bower ve Jamjs gibi istemci tarafı kütüphane yöneticileri için de geçerlidir.

Dosyaları kendi git deponuza bağladıysanız, istediğiniz zaman güncelleyebilirsiniz ve tekrarlanabilir yapıların rahatlığı ve uygulamanızın bazı üçüncü taraf eylemleri nedeniyle kırılmayacağı bilgisine sahip olursunuz.



4
Npmjs'den SSS alıntısı: "npm ekosistemine bağlı olarak paranoyaksanız, özel bir npm aynası veya özel bir önbellek çalıştırmalısınız.". Sanırım bu, bahsettiğiniz konuya işaret ediyor, değil mi?
Taylan


2
Npm gece boyunca kaybolmayacak, bu nedenle fayda, taahhüt geçmişinizdeki ve büyük paket boyutunuzdaki netlik kaybıyla gerçekten eşleşmiyor. Birisi 10 yıl içinde hala aktif olacağını düşündüğü bir uygulama geliştiriyorsa, bu yol boyunca çok fazla bakım almasını beklemek mantıklıdır. NPM kesintileri ile ilgili nokta, bu riski azaltmanın kaynağa bağlı olmaktan daha iyi yolları olsa da, çok daha iyi bir argüman.
Sam P

3
Bağımlılıklarınızı yerine getirmezseniz (tercihen ayrı bir depoda) yolda bir ay bile tehlikelidir. Bir sabah bulduğum gibi, projelerimden birini klonladığımda ve bir paket versiyonunun npm'den kaldırıldığını buldum. Yarım gün harcadım ve npm güncellemesinin tekrar çalışmasını sağlamak için basamaklı bağımlılıkların tüm sürümlerini değiştirdim.
Richard

67

Sen gerektiğini içermez node_modules senin içinde .gitignore(ya da daha doğrusu sen içermelidir node_modules Kaynağınıza Heroku dağıtılan).

Eğer node_modules:

  • Varlığından sonra npm installbu vendored kütüphanelerini kullanır ve herhangi bir ikili bağımlılıklar yeniden inşa edecek npm rebuild.
  • yoksa o zaman npm installsülük derleme adımı için zaman ekler tüm bağımlılıkları kendisi getirmek zorunda kalacaktır.

Bu tam adımlar için Node.js yapı paketi kaynağına bakın

Ancak, orijinal hata sürümleri arasında bir uyumsuzluk olarak görünüyor npmve node. Her zaman açıkça ayarlamak için iyi bir fikirdir enginessenin bölümüne packages.jsongöre bu kılavuzda durumlarda bu tür önlemek için:

{
  "name": "myapp",
  "version": "0.0.1",
  "engines": {
    "node": "0.8.x",
    "npm":  "1.1.x"
  }
}

Bu, dev / ürün paritesini sağlayacak ve gelecekte bu tür durumların olasılığını azaltacaktır.


Yardımın için teşekkürler Ryan. Bu beni npm sürüm hatası geçmiş var ama şimdi redis paketi derlerken başarısız. Hata iletisi: "OSError: [Errno 2] Böyle bir dosya veya dizin yok: '/ Users / Jason / tastemade / tastebase / node_modules / redis-url / node_modules / redis / node_modules / hiredis / build'". Görünüşe göre heroku sunucularındaki yerel kutumdan bir yol kullanıyor. Düğüm_modüllerinde .gitignore'a eklemem gereken belirli dosyalar var mı?
Jason Griffin

Bu kütüphane ile neler olup bittiğinden emin değilim, ama bu durumda node_modules'ü git'den hariç tutmaya ve bunun yardımcı olup olmadığını görmeye çalışacağım (npm'yi her şeyi kendisi almaya ve yeni bir yapı ortamı sağlamaya zorlayarak).
Ryan Daigle

Şimdi @RyanDaigle En iyi uygulama (2013 Kasım) hem npm (önerdiği npmjs.org/doc/... ) ve Heroku ( devcenter.heroku.com/articles/... ) git'e node_modules içinde kontrol etmektir. Yanıtınızı güncelleyebilir misiniz (en iyi faturalandırmaya sahip olduğu için)?
Tim Diggins

Heroku'ya aktarırken "-----> Gelecekteki sürümler için node_modules dizinini önbelleğe alma" çıktısını alırsınız. Bu, gelecekteki bilgi derlemesini kısaltmak içindir.
ph3nx

Node_modules dosyayolunu işlemek için çok uzun bir sorun var. Git dosyaları bulamayacak.
Firavun

22

Bu yorumdan sonra bunu terk edecektim: Heroku'da bir node.js uygulaması oluştururken git için node_modules'ü kontrol etmeli miyim?

Ancak stackoverflow onu tuhaf biçimlendiriyordu. Aynı makineniz yoksa ve node_modules'ü kontrol ediyorsanız, yerel uzantılarda bir .gitignore yapın. Bizim .gitignore şuna benzer:

# Ignore native extensions in the node_modules folder (things changed by npm rebuild)
node_modules/**/*.node
node_modules/**/*.o
node_modules/**/*.a
node_modules/**/*.mk
node_modules/**/*.gypi
node_modules/**/*.target
node_modules/**/.deps/
node_modules/**/build/Makefile
node_modules/**/**/build/Makefile

İlk önce her şeyi kontrol ederek test edin ve ardından başka bir geliştiricinin aşağıdakileri yapmasını sağlayın:

rm -rf node_modules
git checkout -- node_modules
npm rebuild
git status

Hiçbir dosyanın değiştirilmediğinden emin olun.


Bunu ekledim. Sorunumu çözdü. Windows github 7000+ node_module dosyalarını aşmaya çalışırken çökmeye devam etti: /
Batman

10

Bunun npm installbir üretim ortamında çalışmaması gerektiğine inanıyorum . Yanlış gidebilecek birkaç şey var - npm kesintisi, yeni bağımlılıkların indirilmesi (shrinkwrap bunu çözüyor gibi görünüyor) bunlardan ikisi.

Diğer yandan, node_modules git konusunda kararlaştırılmamalıdır. Büyük boyutlarının yanı sıra, bunları içeren taahhütler dikkat dağıtıcı olabilir.

En iyi çözümler şu olurdu: npm installüretim ortamına benzer bir CI ortamında çalışmalıdır. Tüm testler çalıştırılacak ve tüm bağımlılıkları içeren sıkıştırılmış bir yayın dosyası oluşturulacaktır.


Neden dağıtımınızın bir parçası olarak çalışmayan CI üzerinde çalışan bir adımınız olsun ki? Bu, 2 sistem arasında eşitliğiniz olmadığı anlamına gelir! Cevabın yukarıda söylediği gibi - klasörü yerel uzantıları yok sayın, bu şekilde npm kesintileri gibi şeyler için kapsanırsınız
Voycey

1
Yorumun için teşekkürler. Üretim sunucunuzda çalışan node_modules, devs taahhüt ne olursa olsun, bir npm yüklemeden oluşturulması gerektiğini düşünüyorum. Bir dev'in node_modules klasörü package.json içeriğiyle eşleşmiyor olabilir.
user2468170

8

Ben node_modules klasörü ve shrink-sarma taahhüt edilmiştir. Her iki çözüm de beni mutlu etmedi.

Kısacası: taahhüt edilen node_modules depoya çok fazla gürültü ekler.
Ve shrinkwrap.json'un yönetimi kolay değildir ve bazı shrink ambalajlı projelerin birkaç yıl içinde inşa edileceğine dair bir garanti yoktur.

Mozilla'nın projelerinden biri için ayrı bir depo kullandığını tespit ettim https://github.com/mozilla-b2g/gaia-node-modules

Bu yüzden bu fikri bir düğüm CLI aracında uygulamak çok uzun sürmedi https://github.com/bestander/npm-git-lock

Her
derlemeden hemen önce npm-git-lock --repo [git@bitbucket.org: / Dedicated / node_modules / git / repository.git] ekleyin

Paketinizin karma değerini hesaplar ve uzak bir depodan node_modules içeriğini kontrol eder veya bu paket için ilk derleme ise .json temizler npm installve sonuçları uzak repoya gönderir.


5

Benim için işe yarayan açıkça package.json ("npm": "1.1.x") için bir npm sürümü eklemek ve git için node_modules kontrol etmiyordu. Konuşlandırmak daha yavaş olabilir (çünkü paketleri her seferinde indirir), ancak teslim alınırken paketleri derleyemedim. Heroku yalnızca yerel kutumda bulunan dosyaları arıyordu.


Cevabımın doğru olduğunu düşünüyorsanız, lütfen kabul ettiniz mi? Teşekkür ederim!
Ryan Daigle

Bu hala tartışmaya açıksa, yukarıdaki sorunuzun neredeyse bir kopyası olan bu stackoverflow yayınına bir göz atacağım: stackoverflow.com/questions/11459733/… Temel olarak, konvansiyonun node_modules'ü kontrol etmek olduğu anlaşılıyor ve bu modüllerin sürümlerinizi yerel olarak yönetin. Bu oldukça makul görünüyor ve belki de en özlü açıklama şudur: mikealrogers.com/posts/nodemodules-in-git.html İyi şanslar!
warriorpostman

3

Düğüm_modüllerini kontrol etmek yerine uygulamanız için bir package.json dosyası oluşturun.

Package.json dosyası, uygulamanızın bağımlılıklarını belirtir. Heroku daha sonra npm'ye tüm bu bağımlılıkları yüklemesini söyleyebilir. Bağlandığınız eğitici dosya package.json dosyalarında bir bölüm içeriyor.


Bir paketim var. Json. Şunlara sahiptir: {"ad": "düğüm örneği", "sürüm": "0.0.1", "bağımlılıklar": {"ekspres": "2.5.x", "redis-url": "0.1. 0 "," mongodb ":"> = 0.9.9 "}," motorlar ": {" düğüm ":" 0.8.x "}}
Jason Griffin

Yerel kutumda node_modules dizini oluşturmak için yaptım. Ben kontrol ettim, sonra kaldırıldı, sonra geri ekledi.
Jason Griffin

Eğiticiye daha fazla baktıktan sonra, node_modules yapıyor gibi görünüyorlar. Bu durumda, node_modules işlememenin bir yolu olup olmadığından emin değilim. Üzgünüm
matzahboy

3

Bu çözümü kullanıyorum:

  1. Ayrı bir depo oluşturun node_modules. Belirli bir platform için oluşturulması gereken yerel modülleriniz varsa, her platform için ayrı bir havuz oluşturun.
  2. Bu depoları aşağıdakilerle proje havuzunuza ekleyin: git submodule :

git submodule add .../your_project_node_modules_windows.git node_modules_windows

git submodule add .../your_project_node_modules_linux_x86_64 node_modules_linux_x86_64

  1. Platform özgü gelen bağlantı oluşturma node_modulesiçin node_modulesdizin ve eklemek node_modulesiçin .gitignore.
  2. Koş npm install.
  3. Alt modül veri havuzu değişiklikleri yapın.
  4. Proje deposu değişikliklerinizi yapın.

Böylece node_modulesfarklı platformlar arasında kolayca geçiş yapabilirsiniz (örneğin, OS X üzerinde geliştiriyorsanız ve Linux'a dağıtıyorsanız).


3

Gönderen https://web.archive.org/web/20150212165006/http://www.futurealoof.com/posts/nodemodules-in-git.html :

Düzenleme: Orijinal bağlantı bu oldu ama şimdi öldü. @Flavio'ya gösterdiğiniz için teşekkürler.

Özetlemek gerekirse.

  • Yalnızca dağıttığınız uygulamalar için node_modules'ü kontrol edin, bakımını yaptığınız yeniden kullanılabilir paketleri değil.
  • Derlenmiş bağımlılıkların kaynağı derleme hedeflerini değil, teslim edilmeli ve $ npm dağıtımda yeniden oluşturulmalıdır.

Benim favori bölümüm:

Gitignore'nuza node_modules ekleyen tüm insanlar, o boku kaldır, bugün , geride bırakmaktan çok mutlu olduğumuz bir dönemin eseri. Küresel modüllerin dönemi öldü.


Bağlantı verdiğiniz sitenin süresi dolmuş ve şimdi aldatmaca reklamlarla dolu gibi görünüyor. Keşke bu reklamlar "hepimiz geride bırakmaktan çok mutlu olacağımız bir dönemin eserleri" olsaydı.
Flavio Copes

1
@FlavioCopes Cevabımı Wayback Machine bağlantısından güncelledi.
Benjamin Crouzier

2

http://nodejs.org/api/modules.html

[...] düğümü, geçerli modülün üst dizininde başlar ve ekler /node_modulesve modülü bu konumdan yüklemeye çalışır.

Orada bulunmazsa , ağacın köküne ulaşılana kadar üst dizine taşınır ve bu böyle devam eder.

Uygulamanıza özgü kendi modüllerinizi yuvarlıyorsanız, bunları ( ve yalnızca ) uygulamalarınızda tutabilirsiniz/node_modules . Ve diğer tüm bağımlılıkları üst dizine taşıyın.

Oldukça harika olan bu kullanım durumu, uygulamanız için özel olarak uygulamanız için oluşturduğunuz modülleri korumanıza izin verir ve uygulamanızı daha sonra yüklenebilecek bağımlılıklarla karıştırmaz.


1

senaryo 1:

Bir senaryo: npm'den kaldırılan bir paket kullanıyorsunuz. Node_modules klasöründe tüm modüller varsa, bu sizin için sorun olmayacaktır. Package.json içinde sadece paket adı varsa, artık alamazsınız. Bir paket 24 saatten daha eskiyse npm'den kolayca kaldırabilirsiniz. 24 saatten eskiyse onlarla iletişime geçmeniz gerekir. Fakat:

Desteğe başvurursanız, paketinizin bu sürümünü kaldırmanın diğer yüklemeleri bozup bozmayacağını kontrol ederler. Öyleyse, kaldırmayacağız.

daha fazla oku

Yani bunun şansı düşük, ancak 2. senaryo var ...


senaryo 2:

Durumun böyle olduğu başka bir senaryo: Yazılımınızın kurumsal bir sürümünü veya çok önemli bir yazılımı geliştiriyorsunuz ve paketinize yazıyorsunuz.

"dependencies": {
    "studpid-package": "~1.0.1"
}

Bu function1(x)paketin yöntemini kullanıyorsunuz .

Şimdi studpid-paketinin geliştiriciler yöntemini adlandırmak function1(x)için function2(x)ve onlar Onlar kendi paketinin sürümünü değiştirmek ... bir arıza yapmak 1.0.1için 1.1.0. Bu bir sorun çünkü bir npm installdahaki sefere 1.1.0aradığınızda, tilde kullandığınız için sürümü kabul edeceksiniz ("studpid-package": "~1.0.1" ) .

Aramak function1(x)şimdi hatalara ve sorunlara neden olabilir.


Deponuza tüm node_modules klasörünü (genellikle 100 MB'den fazla) itmek, bellek alanınıza mal olur. Yüzlerce MB (package.json ve node_modules) ile karşılaştırıldığında birkaç kb (yalnızca package.json) ... Bir düşünün.

Bunu yapabilir / aşağıdaki durumlarda düşünmelisiniz :

  • yazılım çok önemlidir.

  • bir şey başarısız olduğunda size maliyet.

  • npm kayıt defterine güvenmezsiniz. npm merkezileştirilmiştir ve teorik olarak kapatılabilir.

Sen gerekmez durumlarda ise 99.9% olarak klasör node_modules yayımlamak:

  • sadece kendiniz için bir yazılım geliştirirsiniz.

  • bir şey programladınız ve sonucu GitHub'da yayınlamak istiyorsunuz çünkü başka biri bununla ilgilenebilir.


Node_modules öğesinin deponuzda olmasını istemiyorsanız, bir .gitignoredosya oluşturun ve satırı ekleyin node_modules.

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.