Package.json içinde gerekli Node.js sürümünü nasıl belirtebilirim?


261

Düğüm sürüm 12 veya üstünü gerektiren bir Node.js projem var. Bunu instal.json dosyasında belirtmenin bir yolu var, böylece yükleyici kullanıcıları yükseltmeleri gerekip gerekmediğini otomatik olarak kontrol edecek ve bilgilendirecektir?


1
Adem'in yanıtına benzer şekilde, node.version da kullanılıyor: stackoverflow.com/a/48691987/3032209
Yair Kukielka


Burada zaten soru soruldu: Belirli bir node.js sürümünü kullanmak için nasıl zorlanır?
cilap

API kullanımını inceleyerek bu alanı otomatik olarak uygun bir değere ayarlayabilecek herhangi bir araç olup olmadığını merak ediyorum.
geekley

Yanıtlar:


287

"Motorlar" alanını kullanabileceğinizi düşünüyorum:

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

Kodunuzun kesinlikle daha düşük sürümlerle çalışmadığını söylediğiniz için, muhtemelen "engineStrict" bayrağını da istersiniz:

{ "engineStrict" : true }

Package.json dosyasının belgeleri bulunabilir Package.json npmjs sitesinde bulunabilir

Güncelleme

engineStrictartık kullanımdan kaldırılmıştır, bu nedenle bu yalnızca bir uyarı verir. Bunu npm config set engine-strict trueisterse şimdi çalıştırmak kullanıcıya kalmıştır .

Güncelleme 2

Aşağıda belirtildiği gibi, .npmrcprojenizin kökünde (package.json dosyanızla aynı düzeyde) metin içeren bir dosya oluşturmak engine-strict=true, Düğüm sürümü uyumlu değilse yükleme sırasında bir hatayı zorlar.


13
github.com/npm/npm/blob/master/CHANGELOG.md#enginestrict "nadiren-el package.json seçeneği engineStrictolmuştur kaldırılmış kullanıldığı zaman uyarıları üreten, birkaç ay boyunca. NPM başlayarak @ 3, değerini alan göz ardı edilir ve motor ihlalleri sadece uyarılar üretecek Eğer bir kullanıcı olarak, isterseniz sıkı motorlar saha uygulama, sadece koşmak npm yapılandırma grup motor-katı gerçek".
Mike Stead

1
cd .. && npm i <folder-name>Projenin kendisini kontrol etmek için unutmayın . Ancak bu, kendi içinde bütün bir yapıyı tetikleyecektir.
mlunoe

6
neden yeryüzünde
itiraz

15
engine-strict=true.Npmrc'nize eklemek artık aynı etkiye sahip
ben

4
@ben Mükemmel, teşekkürler! Ve bu, en azından ekibinizin tüm motor sürüm gereksinimlerine uyması gerektiği şekilde yapılabilir.
Joshua Pinter

115

Ekle

için package.json

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

dosyaya .npmrc( package.jsonaynı dizine yakın )

engine-strict=true

3
Bu, son kullanıcıya çalıştıklarında düğümün doğru sürümüne sahip olmamakla ilgili güzel bir yağ hatası veren en kolay çözümdür npm install; ile yarnde çalışır
jcollum

Bunun hiç bir etkisi yok gibi görünüyor. package.jsonYukarıdakine ( 11.13.0ve 6.7.0) benzer bir "motorlar" bölümü ve yukarıda .npmrcbelirtilen içerikten başka bir şey olmadan ayarladım . Ben nvm beni eski bir düğüm sürümüne geçmek vardı, sonra koştu npm install, ama sadece bağımlılıkları yükler ve hatta motor sürümü uyumsuzluk bahsetmiyor.
Adrian

54

Tıpkı söylediği gibi Ibam engineStrictartık kullanımdan kaldırıldı. Ama bu çözümü buldum:

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

Daha fazla bilgiyi buradan edinebilirsiniz: https://medium.com/@adambisek/how-to-check-minimum-required-node-js-version-4a78a8855a0f#.3oslqmig4

.nvmrc

Ve bir şey daha. Nokta düğümü '.nvmrc' belirli düğüm sürümü gerektirmek için kullanılabilir - https://github.com/creationix/nvm#nvmrc

Ancak, yalnızca npm betikleri (ve iplik betikleri) tarafından saygı gösterilir.


2
Bu, ayarlanmış motor kullanımdan kaldırılması ve birçoğunun nvm ile sürüm değiştirmesi nedeniyle bununla (muhtemelen) karşılaştığı gerçeği ışığında 2019'daki en iyi cevaptır.
el sanatları

14

.nvmrc

Eğer varsa böyle NVM kullanarak , büyük olasılıkla, o zaman bir git izlenen verilen proje için gerekli nodejs versiyonunu gösterebilir hangi .nvmrcdosyanın:

echo v10.15.1 > .nvmrc

Bu otomatik olarak cdetkinleşmez, bu da aklı başındadır: kullanıcı daha sonra şunları yapmalıdır:

nvm use

ve şimdi düğümün o sürümü geçerli kabuk için kullanılacak.

Sahip olduğunuz düğüm sürümlerini aşağıdakilerle listeleyebilirsiniz:

nvm list

.nvmrcşu adreste belgelenmiştir: https://github.com/creationix/nvm/tree/02997b0753f66c9790c6016ed022ed2072c22603#nvmrc

Bu düğüm sürümünün otomatik olarak nasıl seçileceği cdsoruldu: Projeye göre Düğümün otomatik olarak doğru sürümüne otomatik olarak geç

NVM 0.33.11 ile test edilmiştir.


8

Bunu yapmanın başka, daha basit bir yolu var:

  1. npm install Node@8 (Düğüm 8'i package.json içinde bağımlılık olarak kaydeder)
  2. Uygulamanız herkes için Node 8 kullanarak çalışacak - hatta İplik kullanıcıları!

Bu işe yarar çünkü nodesadece paketi ikili olarak düğüm gönderen bir pakettir. Yalnızca node_module / .bin olarak içerir, bu da sadece komut dosyalarını paketlemek için düğümü kullanılabilir kıldığı anlamına gelir. Ana kabuk değil.

Twitter'daki tartışmaya buradan bakın: https://twitter.com/housecor/status/962347301456015360


5
Kabul etmiyorum, bu potansiyel olarak sorunu gizleyecek ve yüklenmediyse düğümün farklı bir sürümünü yükleyecektir.
Brendan Hannemann

7
-1 çünkü bu korkunç (gerçekten korkunç) bir fikir. Eğer işsizseniz, önce bir şirkete para yatırmanız gerektiğini ve orada çalışmaya başlayabileceğinizi söylemek gibidir.
ozanmuyes

2
Bana harika bir fikir gibi geliyor. Ayrı projeler için ayrı düğüm versiyonları. Birini diğerlerini yükseltmeden güvenle yükseltebilirsiniz. Sadece catch ./node node-sasssadece .bin içinde çalıştırmak zorunda node-sass. Tüm .bin dosyaları için aynı olup olmadığından emin değilim.
Jon

2
Bu basit ve zarif bir çözümdür - ürün üzerinde çalışan ekip üyeleri bunun olduğunu bildiği sürece, bence harika bir cevap. Bu tekniği büyük bir şirkette bir düzine web ön uç ürünü için çeşitli Düğüm sürümleriyle başa çıkmak için kullanıyoruz. Ürünler arasında ileri geri giderken nvm ile sürekli anahtarlama ihtiyacını ortadan kaldırır.
Nathan Bedford

2
Bu çözümün kendi artıları ve eksileri vardır. Düğüm versiyonu kapsülleme potansiyel olarak en büyük profesyonelidir. Bu şekilde dağıtacaksanız, olumsuz, docker görüntü boyutu şişirilir.
ivosh

0

Mocha test örneği:

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);
    });});

1
Bir birim test, kullanım package.json / dotfiles olmamalı
bgcode

2
Ama whhhhhhhy, bunun için bir birim testi tasarlandı> .-
Jamie Nicholl-Shelley

Ünite testi yapmak için Düğüme ihtiyacınız var. Mevcut düğüm sürümü çok eskiyse, testler basitçe çalışmaz veya sözdizimi hatası veya ikramiyesi ile başarısız olur. benzer, hangi birim test noktasını yener. Bir şifre sıfırlama formunu bir yetkilendirme formunun arkasına saklamak gibidir. Parolayı hatırlayamıyorsanız, parola sıfırlama işlevini kullanmanız gerekir, ancak şimdi parolayı hatırlayamadığınız için kullanamazsınız.
ankhzet
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.