Saya mengikuti instruksi dasar untuk memulai node.js di Heroku di sini:
https://devcenter.heroku.com/categories/nodejs
Instruksi ini tidak memberitahu Anda untuk membuat .gitignore node_modules, dan oleh karena itu menyiratkan bahwa node_modules harus diperiksa untuk git. Ketika saya memasukkan node_modules di git, aplikasi persiapan saya berjalan dengan benar.
Ketika saya mengikuti contoh yang lebih maju di:
https://devcenter.heroku.com/articles/realtime-polyglot-app-node-ruby-mongodb-socketio https://github.com/mongolab/tractorpush-server (sumber)
Itu menginstruksikan saya untuk menambahkan node_modules ke .gitignore. Jadi saya menghapus node_modules dari git, menambahkannya ke .gitignore, kemudian digunakan kembali. Kali ini yang digunakan gagal seperti:
-----> 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
Menjalankan "heroku ps" mengkonfirmasi kerusakan itu. Ok, tidak masalah, jadi saya memutar kembali perubahan, menambahkan node_module kembali ke repositori git dan menghapusnya dari .gitignore. Namun, bahkan setelah kembali, saya masih mendapatkan pesan kesalahan yang sama pada penerapan tetapi sekarang aplikasi berjalan dengan benar lagi. Menjalankan "heroku ps" memberi tahu saya bahwa aplikasi sedang berjalan.
Jadi pertanyaan saya adalah apa cara yang benar untuk melakukan ini? Sertakan node_modules atau tidak? Dan mengapa saya masih mendapatkan pesan kesalahan saat saya mengembalikan? Tebakan saya adalah repositori git dalam kondisi buruk di sisi Heroku?
node_modules
in ke aplikasi Heroku.Jawaban:
Pembaruan Kedua
FAQ tidak tersedia lagi.
Dari dokumentasi
shrinkwrap
:Shannon dan Steven menyebutkan ini sebelumnya, tetapi saya pikir, itu harus menjadi bagian dari jawaban yang diterima.
Memperbarui
Sumber yang tercantum untuk rekomendasi di bawah ini telah diperbarui . Mereka tidak lagi merekomendasikan
node_modules
folder tersebut dikomit.Pos Asli
Untuk referensi, npm FAQ menjawab pertanyaan Anda dengan jelas:
dan untuk alasan yang bagus untuk ini, baca posting Mikeal Rogers tentang ini .
Sumber: https://docs.npmjs.com/misc/faq#should-i-check-my-node-modules-folder-into-git
sumber
.gitignore
? Dengan begitu, sumbernya ada di git, dan komponen yang dikompilasi tidak, sama dengan bagaimanadist
atauoutput
folder yang di-gitignored dalam proyek grunt dan tegukan.Kekhawatiran terbesar saya dengan tidak memeriksa
node_modules
ke git adalah bahwa 10 tahun ke depan, ketika aplikasi produksi Anda masih digunakan, npm mungkin tidak ada. Atau npm mungkin rusak; atau pengelola mungkin memutuskan untuk menghapus perpustakaan yang Anda andalkan dari repositori mereka; atau versi yang Anda gunakan mungkin dipangkas.Ini dapat dikurangi dengan manajer repo seperti pakar, karena Anda selalu dapat menggunakan Nexus atau Artifactory lokal Anda sendiri untuk memelihara mirror dengan paket yang Anda gunakan. Sejauh yang saya mengerti, sistem seperti itu tidak ada untuk npm. Hal yang sama berlaku untuk manajer perpustakaan sisi klien seperti Bower dan Jamjs.
Jika Anda telah mengkomit file ke git repo Anda sendiri, maka Anda dapat memperbaruinya sesuka Anda, dan Anda memiliki kenyamanan build berulang dan pengetahuan bahwa aplikasi Anda tidak akan rusak karena beberapa tindakan pihak ketiga.
sumber
Anda tidak harus memasukkan
node_modules
dalam.gitignore
(atau lebih tepatnya Anda harus memasukkannode_modules
dalam sumber Anda digunakan untuk Heroku).Jika
node_modules
:npm install
akan menggunakan lib yang dibatalkan tersebut dan akan membangun kembali dependensi biner dengannpm rebuild
.npm install
harus mengambil semua dependensi itu sendiri yang menambah waktu untuk langkah kompilasi siput.Lihat sumber buildpack Node.js untuk langkah-langkah yang tepat ini
Namun, kesalahan awal tampaknya menjadi ketidakcocokan antara versi
npm
dannode
. Adalah ide yang baik untuk selalu secara eksplisit mengaturengines
bagian Andapackages.json
sesuai dengan panduan ini untuk menghindari situasi seperti ini:Ini akan memastikan paritas dev / prod dan mengurangi kemungkinan situasi seperti itu di masa depan.
sumber
Saya akan meninggalkan ini setelah komentar ini: Haruskah saya memeriksa node_modules untuk git saat membuat aplikasi node.js di Heroku?
Tapi stackoverflow memformatnya aneh. Jika Anda tidak memiliki mesin yang identik dan sedang memeriksa di node_modules, lakukan .gitignore pada ekstensi asli. .Gitignore kami terlihat seperti:
Uji ini dengan terlebih dahulu memeriksa semuanya, dan kemudian minta pengembang lain melakukan yang berikut:
Pastikan tidak ada file yang berubah.
sumber
Saya percaya bahwa
npm install
seharusnya tidak berjalan di lingkungan produksi. Ada beberapa hal yang bisa salah - pemadaman npm, unduhan dependensi yang lebih baru (shrinkwrap tampaknya menyelesaikan ini) adalah dua di antaranya.Di sisi lain,
node_modules
tidak boleh dilakukan pada git. Terlepas dari ukurannya yang besar, komitmen termasuk mereka dapat menjadi hal yang mengganggu.Solusi terbaik adalah:
npm install
harus dijalankan dalam lingkungan CI yang mirip dengan lingkungan produksi. Semua tes akan berjalan dan file rilis zip akan dibuat yang akan mencakup semua dependensi.sumber
Saya telah menggunakan folder komit simpul_modules dan menyusut-membungkus. Kedua solusi itu tidak membuat saya bahagia.
Singkatnya: commit node_modules menambahkan terlalu banyak noise ke repositori.
Dan shrinkwrap.json tidak mudah dikelola dan tidak ada jaminan bahwa beberapa proyek yang dibungkus susut akan dibangun dalam beberapa tahun.
Saya menemukan bahwa Mozilla menggunakan repositori terpisah untuk salah satu proyek mereka https://github.com/mozilla-b2g/gaia-node-modules
Jadi tidak butuh waktu lama bagi saya untuk mengimplementasikan ide ini dalam alat simpul CLI https://github.com/bestander/npm-git-lock
Tepat sebelum setiap build ditambahkan
npm-git-lock --repo [[email protected]: your / dedicated / node_modules / git / repository.git]
Ini akan menghitung hash dari package.json Anda dan akan memeriksa konten node_modules dari repo jarak jauh, atau, jika ini adalah build pertama untuk package.json ini, akan melakukan pembersihan
npm install
dan mendorong hasilnya ke repo jarak jauh.sumber
Apa yang berhasil untuk saya adalah secara eksplisit menambahkan versi npm ke package.json ("npm": "1.1.x") dan TIDAK memeriksa node_modules ke git. Mungkin lebih lambat untuk digunakan (karena mengunduh paket setiap kali), tetapi saya tidak bisa mendapatkan paket untuk dikompilasi ketika mereka check in. Heroku sedang mencari file yang hanya ada di kotak lokal saya.
sumber
Alih-alih memeriksa di node_modules, buat file package.json untuk aplikasi Anda.
File package.json menentukan dependensi aplikasi Anda. Heroku kemudian dapat memberitahu npm untuk menginstal semua dependensi itu. Tutorial yang Anda tautkan berisi bagian pada file package.json.
sumber
Saya menggunakan solusi ini:
node_modules
. Jika Anda memiliki modul asli yang harus dibuat untuk platform tertentu maka buat repositori terpisah untuk setiap platform.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
node_modules
untuknode_modules
direktori dan menambahkannode_modules
ke.gitignore
.npm install
.Jadi Anda dapat dengan mudah beralih di antara
node_modules
platform yang berbeda (misalnya jika Anda mengembangkan pada OS X dan menggunakan untuk Linux).sumber
Dari https://web.archive.org/web/20150212165006/http://www.futurealoof.com/posts/nodemodules-in-git.html :
Sunting: Tautan asli adalah yang ini tetapi sekarang sudah mati. Terima kasih @ Flavio untuk menunjukkannya.
Bagian Favorit saya:
sumber
http://nodejs.org/api/modules.html
Jika Anda menggulirkan modul Anda sendiri khusus untuk aplikasi Anda, Anda dapat menyimpannya ( dan hanya itu ) di aplikasi Anda
/node_modules
. Dan pindahkan semua dependensi lain ke direktori induk.Ini kasus penggunaan yang cukup luar biasa, memungkinkan Anda menjaga modul yang Anda buat khusus untuk aplikasi Anda dengan baik dengan aplikasi Anda, dan tidak mengacaukan aplikasi Anda dengan dependensi yang dapat diinstal nanti.
sumber
skenario 1:
Satu skenario: Anda menggunakan paket yang dihapus dari npm. Jika Anda memiliki semua modul di folder node_modules, maka itu tidak akan menjadi masalah bagi Anda. Jika Anda hanya memiliki nama paket di package.json, Anda tidak bisa mendapatkannya lagi. Jika suatu paket kurang dari 24 jam, Anda dapat dengan mudah menghapusnya dari npm. Jika lebih dari 24 jam, maka Anda perlu menghubungi mereka. Tapi:
Baca lebih banyak
Jadi peluang untuk ini rendah, tetapi ada skenario 2 ...
skenario 2:
Skenario lain di mana ini terjadi: Anda mengembangkan versi perusahaan dari perangkat lunak Anda atau perangkat lunak yang sangat penting dan menulis di paket Anda. Json:
Anda menggunakan metode
function1(x)
paket itu.Sekarang para pengembang paket-studpid mengubah nama metode
function1(x)
menjadifunction2(x)
dan mereka membuat kesalahan ... Mereka mengubah versi paket mereka dari1.0.1
menjadi1.1.0
. Itu masalah karena ketika Anda meneleponnpm install
waktu berikutnya, Anda akan menerima versi1.1.0
karena Anda menggunakan tilde ("studpid-package": "~1.0.1"
).Panggilan
function1(x)
dapat menyebabkan kesalahan dan masalah sekarang.Mendorong seluruh folder node_modules (seringkali lebih dari 100 MB) ke repositori Anda, akan menghabiskan ruang memori Anda. Beberapa kb (hanya package.json) dibandingkan dengan ratusan MB (package.json & node_modules) ... Pikirkanlah.
Anda dapat melakukannya / harus memikirkannya jika:
perangkat lunaknya sangat penting.
Anda dikenakan biaya ketika ada sesuatu yang gagal.
Anda tidak mempercayai registri npm. NPM terpusat dan secara teoritis dapat ditutup.
Anda tidak perlu menerbitkan folder node_modules di 99,9% dari kasus jika:
Anda mengembangkan perangkat lunak hanya untuk diri Anda sendiri.
Anda telah memprogram sesuatu dan hanya ingin mempublikasikan hasilnya di GitHub karena orang lain mungkin tertarik.
Jika Anda tidak ingin node_modules berada di repositori Anda, cukup buat
.gitignore
file dan tambahkan barisnode_modules
.sumber