Mengapa kita perlu menginstal tegukan secara global dan lokal?

292

2 manual tentang tegukan mengatakan bahwa saya harus menginstal tegukan pertama secara global (dengan -g flag) dan kemudian sekali lagi secara lokal. Mengapa saya membutuhkan ini?

Stepan Suvorov
sumber
12
Halaman "Memulai" proyek sendiri mengatakan hal yang sama. (Juga tidak mengatakan mengapa.)
TJ Crowder
11
Saya berharap npm dapat menggunakan paket dependensi yang diinstal secara global dengan versi yang sama dengan paket lokal. 5MB item glup untuk setiap direktori proyek: /
Ciantic
@Ciantic Tidak ada jaminan, tapi ... ➪ stackoverflow.com/a/25879563/444255
Frank Nocke

Jawaban:

238

Saat memasang alat secara global, itu akan digunakan oleh pengguna sebagai utilitas baris perintah di mana saja, termasuk di luar proyek simpul. Pemasangan global untuk proyek simpul buruk karena membuat penempatan lebih sulit.

npm 5.2+

The npxutilitas dibundel dengan npm 5.2memecahkan masalah ini. Dengan itu Anda dapat memanggil utilitas yang diinstal secara lokal seperti utilitas yang diinstal secara global (tetapi Anda harus memulai perintah dengan npx). Misalnya, jika Anda ingin menjalankan yang diinstal secara lokal eslint, Anda dapat melakukan:

npx eslint .

npm <5.2

Ketika digunakan dalam scriptbidang package.json Anda, npmcari node_modulesalat tersebut serta modul yang diinstal secara global, sehingga pemasangan lokal cukup.

Jadi, jika Anda senang (dalam paket Anda. Json):

"devDependencies": {
    "gulp": "3.5.2"
}
"scripts": {
    "test": "gulp test"
}

dll dan berjalan dengan npm run testmaka Anda tidak perlu menginstal global sama sekali.

Kedua metode ini berguna untuk membuat orang menyiapkan proyek Anda karena sudotidak diperlukan. Ini juga berarti bahwa gulpakan diperbarui ketika versi bertemu di package.json, jadi semua orang akan menggunakan versi tegukan yang sama ketika mengembangkan dengan proyek Anda.

Tambahan:

Tampaknya tegukan memiliki beberapa perilaku yang tidak biasa ketika digunakan secara global. Ketika digunakan sebagai instalasi global, tegukan mencari tegukan yang diinstal secara lokal untuk memberikan kontrol. Oleh karena itu instal global tegukan membutuhkan instal lokal untuk bekerja. Namun jawaban di atas masih ada. Pemasangan lokal selalu lebih disukai daripada pemasangan global.

qubyte
sumber
3
Ya tetapi bagaimana ketika Anda tidak memiliki akses internet? Bagaimana Anda bisa menggunakan tegukan jika tidak terpasang secara global?
IGRACH
3
@IGRACH Skrip di atas tidak menggunakan koneksi internet. Jika Anda ingin melakukan hal yang sama tanpa menggunakan bidang skrip di package.json, maka gunakan ./node_modules/.bin/gulp.
qubyte
1
Saya telah mendefinisikan alias untuk gulpdan coffeeperintah tersebut bekerja dari root proyek simpul saya (mis. alias gulp="node_modules/.bin/gulp"). Dengan cara ini, perintah mudah digunakan jika diperlukan dan konflik versi global / lokal tidak terjadi.
vesse
Terima kasih @ qubyte! Saya pikir menginstalnya secara lokal adalah praktik yang baik secara umum. Saya punya satu pertanyaan lagi sehingga saya harap Anda dapat membantu menjernihkan pikiran saya. Saya mencoba menginstalnya secara global seperti yang disarankan dokumen Gulp tanpa menginstalnya secara lokal. Jadi ketika saya mencoba menjalankannya gulp, itu memberi saya pesan kesalahan berikut Local gulp not found in .... Sejauh yang saya mengerti, pertama-tama harus melihat node_modules lokal dan jika tidak ditemukan maka harus melihat ke modul yang terinstal secara global, bukan? Terima kasih!
yeelan
1
Menambahkan sebuah addendum. Semoga itu mencakup keanehan tegukan.
qubyte
82

TLDR; Inilah alasannya :

Alasan ini berhasil adalah karena gulpmencoba menjalankan Anda gulpfile.jsmenggunakan versi yang diinstal secara lokal gulp, lihat di sini . Karenanya alasan untuk menginstal tegukan global dan lokal.

Pada dasarnya, ketika Anda menginstal gulpsecara lokal skrip tidak ada dalam Anda PATHsehingga Anda tidak bisa mengetik gulpdan mengharapkan shell untuk menemukan perintah. Dengan menginstalnya secara global gulpskrip masuk ke Anda PATHkarena node/bin/direktori global kemungkinan besar ada di jalur Anda.

Untuk menghormati ketergantungan lokal Anda, gulpakan menggunakan versi yang Anda instal sendiri untuk menjalankan gulpfile.js.

Dwayne Crooks
sumber
1
~ / bin adalah konvensi Unix untuk binari per pengguna, dan secara PATH secara default di banyak OS. tegukan harus dapat menghubungkan binernya dari sana.
mikemaccana
2
Dengan kata lain, gulppaket Anda yang terinstal secara global diperlukan untuk menjalankannya node_modules/.bin/gulp. Penyimpanan murah tetapi membuang MB untuk mensimulasikan symlink adalah kecerobohan IMO murni.
NTD
79

Anda dapat menghubungkan tautan yang diinstal gulpsecara global dengan

npm link gulp
Berislav Lopac
sumber
1
Saya tahu bahwa yang terbaik adalah menggunakan pemasangan lokal, tetapi mungkin ada kasus di mana Anda tidak dapat menginstalnya atau hanya tidak mau (bayangkan bahwa server CI khusus Anda telah menelan secara global diinstal dan Anda menginstal ulang pada setiap komit) . Pokoknya, +1 untuk disebutkan npm link.
gion_13
1
Saya melihat apa yang Anda lakukan di sana. Itu pintar.
deepelement
Ini tidak berusaha menjawab pertanyaan
mikemaccana
1
Tidak, itu hanya membatalkannya.
Berislav Lopac
67

Pertanyaan " Mengapa kita perlu menginstal tegukan secara global dan lokal? " Dapat dipecah menjadi dua pertanyaan berikut:

  1. Mengapa saya harus menginstal gulp secara lokal jika saya sudah menginstalnya secara global?

  2. Mengapa saya harus menginstal gulp secara global jika saya sudah menginstalnya secara lokal?

Beberapa yang lain telah memberikan jawaban yang sangat baik untuk pertanyaan-pertanyaan tesis ini secara terpisah, tetapi saya pikir akan bermanfaat untuk menggabungkan informasi dalam jawaban yang terpadu.

Mengapa saya harus menginstal gulp secara lokal jika saya sudah menginstalnya secara global?

Alasan untuk menginstal gulp secara lokal terdiri dari beberapa alasan:

  1. Termasuk dependensi dari proyek Anda secara lokal memastikan versi tegukan (atau dependensi lain) yang digunakan adalah versi yang semula dimaksudkan.
  2. Node tidak menganggap modul global secara default saat menggunakan require () (yang perlu Anda sertakan gulp dalam skrip Anda). Pada akhirnya, ini karena jalur ke modul global tidak ditambahkan ke NODE_PATH secara default.
  3. Menurut tim pengembangan Node, modul lokal memuat lebih cepat. Saya tidak bisa mengatakan mengapa ini terjadi, tetapi ini tampaknya lebih relevan untuk penggunaan node dalam produksi (yaitu run-time dependency) daripada dalam pengembangan (mis. Dependensi dev). Saya kira ini adalah alasan yang sah karena beberapa mungkin peduli tentang keuntungan kecepatan kecil apa pun yang diperoleh dengan memuat modul lokal vs global, tetapi jangan ragu untuk menaikkan alis Anda pada alasan ini.

Mengapa saya harus menginstal gulp secara global jika saya sudah menginstalnya secara lokal?

  1. Alasan untuk menginstal gulp secara global sebenarnya hanyalah kenyamanan memiliki gulp yang dapat dieksekusi secara otomatis ditemukan dalam jalur sistem Anda.

Untuk menghindari menginstal secara lokal, Anda dapat menggunakan npm link [package], tetapi perintah tautan serta install --globalperintah tersebut tampaknya tidak mendukung --save-devopsi yang berarti tampaknya tidak ada cara yang mudah untuk menginstal gulp secara global dan kemudian dengan mudah menambahkan versi apa pun untuk file package.json lokal Anda.

Pada akhirnya, saya percaya lebih masuk akal untuk memiliki opsi menggunakan modul global untuk menghindari duplikasi pemasangan alat-alat umum di semua proyek Anda, terutama dalam hal alat pengembangan seperti gerutuan, tegukan, jshint, dll. Sayangnya itu tampaknya Anda akhirnya sedikit memperjuangkan alat ketika Anda melawan arus.

Derek Greer
sumber
7
+1 untuk menjadi orang pertama di seluruh internet yang menunjukkan bahwa ada dua poin untuk pertanyaan itu. Kebanyakan orang di mana-mana hanya menjawab, "Mengapa saya harus menginstal tegukan global jika saya sudah menginstalnya secara lokal?" ketika apa yang ingin saya ketahui adalah "Mengapa saya harus menginstal tegukan lokal jika saya sudah menginstalnya secara global?".
Nathan JB
10
Fakta bahwa pertanyaan ini membutuhkan penjelasan yang sangat rumit berarti bahwa ini bukan cara kerja yang sangat logis. Menginstal alat yang sama berulang-ulang untuk setiap proyek seharusnya tidak perlu.
Kokodoko
4
Jawaban Anda sangat indah tanpa emosi. Milik saya akan memiliki 80% swearwords, karena ini tampaknya sangat bodoh. Dari perspektif perkakas, teori instalasi lokal mungkin benar tetapi dari perspektif OS dan perspektif manajer paket, ini sangat gila sehingga saya tidak dapat menemukan kata-kata untuk itu. Obat-obatan apa yang dipakai NPM / menelan lelaki?!? Jika ada yang tidak setuju, baca bagaimana pengelola paket sistem seperti dpkg, yum, pacman and co. kerja.
JepZ
2
@ JepZ itu hanya tegukan menjadi super aneh, tidak ada dalam node atau npm yang memaksa ini. Dan menjaga versi spesifik tegukan dalam proyek itu hanya masuk akal jika para tegukan mematahkan versi tambalan secara teratur atau sesuatu, alat pembangun lain biasanya merupakan instalasi global. Tapi ah baiklah. Di sini hanya untuk bersumpah.
Stoffe
2
Ini benar-benar bukan masalah sekarang karena komunitas telah beralih ke hanya menggunakan benang :)
Derek Greer
8

Secara teknis Anda tidak perlu menginstalnya secara global jika node_modulesfolder di instalasi lokal Anda ada di folder Anda PATH. Biasanya ini bukan ide yang baik.

Atau jika npm testreferensi gulpmaka Anda cukup mengetik npm testdan itu akan menjalankan tegukan lokal.

Saya tidak pernah menginstal tegukan global - saya pikir itu bentuk yang buruk.

Robrich
sumber
3
Pendekatan yang lebih baik daripada menempatkannya di jalur Anda adalah dengan menggunakan skrip NPM
Jay
2

Saya tidak yakin apakah masalah kami secara langsung terkait dengan menginstal tegukan hanya secara lokal. Tapi kami harus menginstal banyak dependensi sendiri. Ini mengarah ke package.json "besar" dan kami tidak yakin apakah itu benar-benar ide bagus untuk menginstal gulp hanya secara lokal. Kami harus melakukannya karena lingkungan binaan kami. Tetapi saya tidak akan merekomendasikan untuk menginstal gulp tidak secara global jika tidak mutlak diperlukan. Kami menghadapi masalah serupa seperti yang dijelaskan dalam posting blog berikut

Tidak ada masalah yang muncul untuk pengembang kami di mesin lokal mereka karena mereka semua menginstal gulp secara global. Pada sistem build kami memiliki masalah yang dijelaskan. Jika seseorang tertarik, saya bisa menyelam lebih dalam ke masalah ini. Tetapi saat ini saya hanya ingin menyebutkan bahwa itu bukan jalan yang mudah untuk menginstal tegukan hanya secara lokal.

tschoartschi
sumber
Ya, tolong, selami lebih dalam masalah ini.
kenorb
1

Hanya karena saya belum melihatnya di sini, jika Anda menggunakan MacOS atau Linux, saya sarankan Anda menambahkan ini ke PATH Anda (di bashrc Anda dll):

node_modules/.bin

Dengan entri jalur relatif ini, jika Anda duduk di folder root dari setiap proyek node, Anda dapat menjalankan alat baris perintah apa pun (eslint, tegukan, dll.) Tanpa khawatir tentang "instalasi global" atau npm rundll.

Setelah saya melakukan ini, saya tidak pernah menginstal modul secara global.

Elliot Nelson
sumber