ฉันจะระบุเวอร์ชัน Node.js ที่ต้องการใน package.json ได้อย่างไร


261

ฉันมีโครงการ Node.js ที่ต้องใช้โหนด 12 หรือสูงกว่า มีวิธีระบุในไฟล์ packages.json หรือไม่เพื่อให้ตัวติดตั้งตรวจสอบและแจ้งผู้ใช้โดยอัตโนมัติหากพวกเขาต้องการอัพเกรด


1
วิธีที่คล้ายกับการตอบสนองของอดัมใช้ node.version: stackoverflow.com/a/48691987/3032209
Yair Kukielka


คำถามถูกถามแล้วที่นี่: วิธีการบังคับใช้รุ่น node.js ที่เฉพาะเจาะจงที่จะใช้?
cilap

ฉันสงสัยว่ามีเครื่องมือใดที่สามารถตั้งค่าฟิลด์นี้เป็นค่าที่เหมาะสมโดยอัตโนมัติโดยตรวจสอบการใช้ API
geekley

คำตอบ:


287

ฉันคิดว่าคุณสามารถใช้ฟิลด์ "เครื่องมือ":

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

ในขณะที่คุณกำลังบอกว่ารหัสของคุณจะไม่ทำงานกับเวอร์ชันที่ต่ำกว่าคุณอาจต้องการแฟล็ก "engineStrict" เช่นกัน:

{ "engineStrict" : true }

เอกสารสำหรับไฟล์ package.json สามารถพบได้ในเว็บไซต์ npmjs

ปรับปรุง

engineStrictเลิกใช้แล้วดังนั้นนี่จะเป็นการเตือนเท่านั้น ตอนนี้ผู้ใช้สามารถเรียกใช้งานได้npm config set engine-strict trueหากพวกเขาต้องการสิ่งนี้

อัปเดต 2

ดังที่ Ben ชี้ให้เห็นด้านล่างการสร้าง.npmrcไฟล์ที่รากของโครงการของคุณ (ระดับเดียวกับไฟล์ package.json ของคุณ) ด้วยข้อความengine-strict=trueจะบังคับให้เกิดข้อผิดพลาดระหว่างการติดตั้งหากเวอร์ชันของโหนดไม่เข้ากัน


13
github.com/npm/npm/blob/master/CHANGELOG.md#enginestrict "ตัวเลือก package.json ที่ไม่ค่อยใช้งานengineStrictได้ถูกเลิกใช้ มาหลายเดือนแล้วจึงสร้างคำเตือนเมื่อมีการใช้เริ่มต้นด้วย npm @ 3, ค่าของ จะถูกละเว้นฟิลด์และการละเมิดเครื่องยนต์จะสร้างคำเตือนเท่านั้นหากคุณเป็นผู้ใช้ต้องการการบังคับใช้ฟิลด์ที่เข้มงวดเพียงแค่เรียกใช้การกำหนดค่า npm ให้ตั้งค่าความเข้มงวดของเครื่องยนต์จริง "
Mike Stead

1
จำไว้ว่าให้cd .. && npm i <folder-name>ตรวจสอบตัวโครงการเอง อย่างไรก็ตามสิ่งนี้จะก่อให้เกิดการสร้างทั้งหมดในตัวมันเอง
mlunoe

6
ทำไมพวกเขาเลิกกันแล้วบนโลกว่า .. มัน
สูญเสีย

15
การเพิ่ม. engine-strict=truenpmrc ของคุณในตอนนี้มีผลเหมือนกัน
ben

4
@ben สมบูรณ์แบบขอขอบคุณ! และสิ่งนี้สามารถเกิดขึ้นได้เพื่อให้ทีมของคุณอย่างน้อยต้องปฏิบัติตามข้อกำหนดของรุ่นเครื่องยนต์
Joshua Pinter

115

เพิ่ม

ถึง package.json

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

ไปยังไฟล์.npmrc(ใกล้กับpackage.jsonไดเรกทอรีเดียวกัน)

engine-strict=true

3
นี่คือทางออกที่ง่ายที่สุดที่จะช่วยให้ผู้ใช้ข้อผิดพลาดไขมันที่ดีเกี่ยวกับการไม่ได้มีรุ่นที่เหมาะสมของโหนดเมื่อพวกเขาทำงานnpm install; ทำงานร่วมกับyarnได้เป็นอย่างดี
jcollum

ดูเหมือนว่าจะไม่มีผลกระทบใด ๆ เลย ฉันตั้งค่าส่วนของฉันpackage.jsonด้วย "เอ็นจิ้น" ที่คล้ายกับข้างบน ( 11.13.0และ6.7.0) และ.npmrcไม่มีอะไรนอกจากเนื้อหาที่ระบุข้างต้น ฉันมี nvm เปลี่ยนให้ฉันเป็นโหนดรุ่นที่เก่ากว่าแล้ววิ่งnpm installแต่มันก็แค่ติดตั้งการพึ่งพาและไม่ได้พูดถึงรุ่นเครื่องยนต์ไม่ตรงกัน
เอเดรียน

54

เช่นเดียวกับที่กล่าวถึงอิบันengineStrictตอนนี้เลิกใช้แล้ว แต่ฉันได้พบวิธีแก้ปัญหานี้:

เช็ค 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"
  }
}

ค้นหาข้อมูลเพิ่มเติมได้ที่นี่: https://medium.com/@adambisek/how-to-check-minimum-required-node-js-version-4a78a8855a0f#.3oslqmig4

.nvmrc

และอีกสิ่งหนึ่ง dotfile '.nvmrc' สามารถใช้สำหรับการกำหนดรุ่นโหนดที่เฉพาะเจาะจง - https://github.com/creationix/nvm#nvmrc

แต่เป็นที่เคารพโดยสคริปต์ npm เท่านั้น (และสคริปต์แบบเส้นด้าย)


2
นี่เป็นคำตอบที่ดีที่สุดในปี 2562 เนื่องจากมีการตัดการตั้งค่าเครื่องยนต์และความจริงที่หลายคนกำลังเผชิญอยู่เนื่องจากการสลับรุ่นด้วย nvm
งานฝีมือ

14

.nvmrc

หากคุณกำลังใช้ NVM เช่นนี้ซึ่งเป็นไปได้ว่าคุณควรระบุรุ่น nodejs ที่จำเป็นสำหรับโครงการที่กำหนดใน.nvmrcไฟล์ที่มีการติดตาม git :

echo v10.15.1 > .nvmrc

สิ่งนี้จะไม่มีผลโดยอัตโนมัติเมื่อcdเปิดซึ่งมีเหตุผล: ผู้ใช้ต้องทำ:

nvm use

และตอนนี้รุ่นของโหนดนั้นจะถูกใช้สำหรับเชลล์ปัจจุบัน

คุณสามารถแสดงรายการเวอร์ชันของโหนดที่คุณมี:

nvm list

.nvmrc มีการบันทึกไว้ที่: https://github.com/creationix/nvm/tree/02997b0753f66c9790c6016ed022ed2072c22603#nvmrc

วิธีการเลือกรุ่นโหนดบนโดยอัตโนมัติcdถูกถามที่:เปิดโดยอัตโนมัติสลับไปยังรุ่นที่ถูกต้องของโหนดโดยอัตโนมัติตามโครงการ

ทดสอบกับ NVM 0.33.11


8

มีวิธีอื่นที่ง่ายกว่าในการทำสิ่งนี้:

  1. npm install Node@8 (บันทึก Node 8 เป็นการพึ่งพาใน package.json)
  2. แอปของคุณจะทำงานโดยใช้โหนด 8 สำหรับทุกคน - แม้กระทั่งผู้ใช้ Yarn!

ใช้งานได้เพราะ nodeเป็นเพียงแพ็คเกจที่จัดส่งโหนดเป็นไบนารีแพ็กเกจ มันรวมเป็น node_module / .bin ซึ่งหมายความว่าจะทำให้โหนดพร้อมใช้งานกับสคริปต์แพคเกจเท่านั้น ไม่ใช่เปลือกหลัก

ดูการสนทนาบน Twitter ได้ที่: https://twitter.com/housecor/status/962347301456015360


5
ฉันไม่เห็นด้วยนี่อาจซ่อนปัญหาและจะโหลดโหนดรุ่นอื่นที่ไม่ได้ติดตั้งไว้
เบรนแดน Hannemann

7
-1 เพราะนี่เป็นความคิดที่แย่มาก (แย่จริงๆ) มันก็เหมือนกับการพูดว่าถ้าคุณว่างงานคุณควรให้ทุนแก่ บริษัท ก่อนและคุณสามารถเริ่มทำงานที่นั่นได้
ozanmuyes

2
ฟังดูเหมือนเป็นความคิดที่ดีสำหรับฉัน แยกรุ่นโหนดสำหรับโครงการที่แยกต่างหาก สามารถอัปเกรดได้อย่างปลอดภัยโดยไม่ต้องอัปเกรดอื่น ๆ เพียงจับเป็นต้องใช้ในถังขยะมากกว่าแค่./node node-sass node-sassไม่แน่ใจว่าเหมือนกันสำหรับไฟล์. bin ทั้งหมด
Jon

2
นี่เป็นทางออกที่ง่ายและสง่างาม - ตราบใดที่สมาชิกในทีมที่ทำงานเกี่ยวกับผลิตภัณฑ์รู้ว่าสิ่งนี้กำลังเกิดขึ้นฉันคิดว่ามันเป็นคำตอบที่ยอดเยี่ยม เราใช้เทคนิคนี้ใน บริษัท ขนาดใหญ่เพื่อจัดการกับ Node รุ่นต่างๆสำหรับผลิตภัณฑ์ส่วนหน้าเว็บจำนวนมาก ขจัดความจำเป็นในการสลับค่าคงที่ด้วย nvm เมื่อไปกลับระหว่างผลิตภัณฑ์
นาธานเบดฟอร์ด

2
วิธีนี้มีข้อดีและข้อเสียของตัวเอง การห่อหุ้มโหนดรุ่นอาจเป็นโปรที่ใหญ่ที่สุด ข้อเสียคือภาพขนาดนักเทียบเรือป่องถ้าคุณจะปรับใช้ด้วยวิธีนี้
ivosh

0

ตัวอย่างกรณีทดสอบ 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);
    });});

1
ไม่ควรเป็นการทดสอบหน่วยให้ใช้ package.json / dotfiles
bgcode

2
แต่ whhhhhhy การทดสอบหน่วยถูกออกแบบมาสำหรับสิ่งนี้>. -
Jamie Nicholl-Shelley

เพราะคุณต้องการโหนดเพื่อเรียกใช้การทดสอบหน่วย หากเวอร์ชันของโหนดปัจจุบันล้าสมัยเกินไปการทดสอบจะไม่ทำงานหรือจะล้มเหลวเนื่องจากข้อผิดพลาดทางไวยากรณ์หรือ smth ที่คล้ายกันซึ่งเอาชนะจุดของการทดสอบหน่วย มันเหมือนกับการซ่อนฟอร์มการรีเซ็ตรหัสผ่านไว้ด้านหลังแบบฟอร์มการอนุญาต หากคุณจำรหัสผ่านไม่ได้คุณต้องใช้ฟังก์ชั่นรีเซ็ตรหัสผ่าน แต่ตอนนี้คุณไม่สามารถใช้งานได้เพราะคุณจำรหัสผ่านไม่ได้
ankhzet
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.