Bagaimana saya bisa menentukan versi Node.js yang diperlukan di package.json?

261

Saya memiliki proyek Node.js yang memerlukan Node versi 12 atau lebih tinggi. Apakah ada cara untuk menentukan ini di file paket.json, sehingga installer akan secara otomatis memeriksa dan memberi tahu pengguna jika mereka perlu memutakhirkan?

Erel Segal-Halevi
sumber
1
Cara yang mirip dengan respons Adam, juga menggunakan node.version: stackoverflow.com/a/48691987/3032209
Yair Kukielka
Pertanyaan sudah diajukan di sini: Bagaimana cara menegakkan versi node.js tertentu untuk digunakan?
cilap
Saya ingin tahu apakah ada alat yang dapat secara otomatis mengatur bidang ini ke nilai yang sesuai dengan memeriksa penggunaan API.
geekley

Jawaban:

288

Saya pikir Anda dapat menggunakan bidang "mesin":

{ "engines" : { "node" : ">=0.12" } }

Seperti yang Anda katakan kode Anda pasti tidak akan berfungsi dengan versi yang lebih rendah, Anda mungkin ingin bendera "engineStrict" juga:

{ "engineStrict" : true }

Dokumentasi untuk file package.json dapat ditemukan di situs npmjs

Memperbarui

engineStrictsudah tidak digunakan lagi, jadi ini hanya akan memberikan peringatan. Sekarang tergantung pada pengguna untuk menjalankan npm config set engine-strict truejika mereka menginginkan ini.

Perbarui 2

Seperti yang ditunjukkan di bawah ini, membuat .npmrcfile di root proyek Anda (tingkat yang sama dengan file package.json Anda) dengan teks engine-strict=trueakan memaksa kesalahan selama instalasi jika versi Node tidak kompatibel.

IBam
sumber
13
github.com/npm/npm/blob/master/CHANGELOG.md#enginestrict "Opsi package.json yang jarang digunakan engineStricttelah ditinggalkan selama beberapa bulan, menghasilkan peringatan saat digunakan. Dimulai dengan npm @ 3, nilai dari lapangan diabaikan, dan pelanggaran mesin hanya akan menghasilkan peringatan. Jika Anda, sebagai pengguna, menginginkan penegakan hukum engine yang ketat, jalankan saja npm config atur engine-strict true "
Mike Stead
1
Ingatlah untuk cd .. && npm i <folder-name>memeriksa proyek itu sendiri. Namun, ini akan memicu keseluruhan bangunan di dalamnya.
mlunoe
6
mengapa mereka menolak itu .. kehilangan semua artinya
vasilakisfil
15
Menambahkan engine-strict=trueke .npmrc Anda sekarang memiliki efek yang sama
ben
4
@ Ben Sempurna, terima kasih! Dan ini dapat dilakukan sehingga setidaknya seluruh tim Anda harus mematuhi persyaratan versi mesin.
Joshua Pinter
115

Menambahkan

untuk package.json

  "engines": {
    "node": ">=10.0.0",
    "npm": ">=6.0.0"
  },

ke file .npmrc(dekat dengan package.json, direktori yang sama)

engine-strict=true
Mikel
sumber
3
Ini adalah solusi termudah yang memberi pengguna akhir kesalahan berat yang bagus tentang tidak memiliki versi node yang tepat saat dijalankan npm install; bekerja dengan yarnbaik
jcollum
1
Ini tampaknya tidak berpengaruh sama sekali. Saya mengatur bagian saya package.jsondengan "mesin" yang mirip dengan yang di atas ( 11.13.0dan 6.7.0), dan .npmrcdengan apa pun kecuali konten yang ditentukan di atas. Saya telah nvm beralih saya ke versi node yang lebih lama, kemudian berlari npm install, tetapi hanya menginstal dependensi dan bahkan tidak menyebutkan ketidakcocokan versi mesin.
Adrian
54

Sama seperti kata Ibam, engineStrictsekarang sudah usang. Tetapi saya telah menemukan solusi ini:

check-version.js:

import semver from 'semver';
import { engines } from './package';

const version = engines.node;
if (!semver.satisfies(process.version, version)) {
  console.log(`Required node version ${version} not satisfied with current version ${process.version}.`);
  process.exit(1);
}

package.json:

{
  "name": "my package",
  "engines": {
    "node": ">=50.9" // intentionally so big version number
  },
  "scripts": {
    "requirements-check": "babel-node check-version.js",
    "postinstall": "npm run requirements-check"
  }
}

Cari tahu lebih lanjut di sini: https://medium.com/@adambisek/how-to-check-minimum-required-node-js-version-4a78a8855a0f#.3oslqmig4

.nvmrc

Dan satu hal lagi. Dotfile '.nvmrc' dapat digunakan untuk membutuhkan versi node spesifik - https://github.com/creationix/nvm#nvmrc

Tapi, itu hanya dihormati oleh skrip npm (dan skrip benang).

Adam
sumber
2
Ini adalah jawaban terbaik pada tahun 2019, mengingat penghentian set mesin dan kenyataan bahwa banyak (kemungkinan) menghadapi ini karena beralih versi dengan nvm.
kerajinan
14

.nvmrc

Jika Anda menggunakan NVM seperti ini , yang seharusnya Anda lakukan, maka Anda dapat menunjukkan versi nodejs yang diperlukan untuk proyek yang diberikan dalam .nvmrcfile yang dilacak git :

echo v10.15.1 > .nvmrc

Ini tidak berlaku secara otomatis cd, yang waras: maka pengguna harus melakukan:

nvm use

dan sekarang versi node akan digunakan untuk shell saat ini.

Anda bisa mendaftar versi node yang Anda miliki dengan:

nvm list

.nvmrcdidokumentasikan di: https://github.com/creationix/nvm/tree/02997b0753f66c9790c6016ed022ed2072c22603#nvmrc

Cara otomatis memilih versi node pada cddiminta di: Secara otomatis beralih ke versi Node yang benar berdasarkan proyek

Diuji dengan NVM 0.33.11.

Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
sumber
8

Ada cara lain yang lebih sederhana untuk melakukan ini:

  1. npm install Node@8 (menyimpan Node 8 sebagai dependensi dalam package.json)
  2. Aplikasi Anda akan berjalan menggunakan Node 8 untuk siapa saja - bahkan pengguna Benang!

Ini berfungsi karena nodehanya paket yang mengirimkan simpul sebagai paket binernya. Itu hanya termasuk sebagai node_module / .bin yang berarti hanya membuat simpul tersedia untuk skrip paket. Bukan shell utama.

Lihat diskusi di Twitter di sini: https://twitter.com/housecor/status/962347301456015360

vnglst
sumber
5
Saya tidak setuju, ini berpotensi menyembunyikan masalah dan akan mengganti versi yang berbeda dari node jika tidak diinstal.
Brendan Hannemann
7
-1 karena ini adalah ide yang sangat buruk. Ini seperti mengatakan bahwa jika Anda menganggur, Anda harus mendanai perusahaan terlebih dahulu dan Anda dapat mulai bekerja di sana.
ozanmuyes
2
Sepertinya ide yang bagus untuk saya. Versi node yang terpisah untuk proyek yang terpisah. Dapat dengan aman memutakhirkan satu tanpa memutakhirkan yang lain. Hanya tangkapan yang harus dijalankan di .bin, ./node node-sassbukan hanya node-sass. Tidak yakin apakah sama untuk semua file .bin.
Jon
2
Ini adalah solusi yang sederhana dan elegan - selama anggota tim yang mengerjakan produk tahu ini terjadi, saya pikir itu adalah jawaban yang bagus. Kami menggunakan teknik ini di sebuah perusahaan besar untuk menangani berbagai versi Node untuk selusin produk front-end web. Menghapus kebutuhan untuk peralihan yang konstan dengan nvm saat bolak-balik di antara produk.
Nathan Bedford
2
Solusi ini memiliki pro dan kontra sendiri. Enkapsulasi versi simpul berpotensi menjadi yang terbesar. The downside adalah ukuran gambar buruh pelabuhan membengkak jika Anda akan menggunakannya dengan cara ini.
ivosh
0

Contoh kasus uji Mocha:

describe('Check version of node', function () {
    it('Should test version assert', async function () {

            var version = process.version;
            var check = parseFloat(version.substr(1,version.length)) > 12.0;
            console.log("version: "+version);
            console.log("check: " +check);         
            assert.equal(check, true);
    });});
Jamie Nicholl-Shelley
sumber
1
Seharusnya tidak menjadi unit test, gunakan package.json / dotfiles
bgcode
2
Tapi yang, uji coba unit dirancang untuk ini> .-
Jamie Nicholl-Shelley
Karena Anda memerlukan Node untuk menjalankan unit test. Jika versi node yang ada sudah ketinggalan jaman, tes tidak akan berjalan atau akan gagal dengan kesalahan sintaks atau pertanda. serupa, yang mengalahkan titik pengujian unit. Ini seperti menyembunyikan formulir pengaturan ulang kata sandi di belakang formulir otorisasi. Jika Anda tidak dapat mengingat kata sandi, Anda harus menggunakan fungsi atur ulang kata sandi, tetapi sekarang Anda tidak dapat menggunakannya, karena Anda tidak mengingat kata sandinya.
ankhzet