ฉันมีโครงการ Node.js ที่ต้องใช้โหนด 12 หรือสูงกว่า มีวิธีระบุในไฟล์ packages.json หรือไม่เพื่อให้ตัวติดตั้งตรวจสอบและแจ้งผู้ใช้โดยอัตโนมัติหากพวกเขาต้องการอัพเกรด
ฉันมีโครงการ Node.js ที่ต้องใช้โหนด 12 หรือสูงกว่า มีวิธีระบุในไฟล์ packages.json หรือไม่เพื่อให้ตัวติดตั้งตรวจสอบและแจ้งผู้ใช้โดยอัตโนมัติหากพวกเขาต้องการอัพเกรด
คำตอบ:
ฉันคิดว่าคุณสามารถใช้ฟิลด์ "เครื่องมือ":
{ "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
จะบังคับให้เกิดข้อผิดพลาดระหว่างการติดตั้งหากเวอร์ชันของโหนดไม่เข้ากัน
engineStrict
ได้ถูกเลิกใช้ มาหลายเดือนแล้วจึงสร้างคำเตือนเมื่อมีการใช้เริ่มต้นด้วย npm @ 3, ค่าของ จะถูกละเว้นฟิลด์และการละเมิดเครื่องยนต์จะสร้างคำเตือนเท่านั้นหากคุณเป็นผู้ใช้ต้องการการบังคับใช้ฟิลด์ที่เข้มงวดเพียงแค่เรียกใช้การกำหนดค่า npm ให้ตั้งค่าความเข้มงวดของเครื่องยนต์จริง "
cd .. && npm i <folder-name>
ตรวจสอบตัวโครงการเอง อย่างไรก็ตามสิ่งนี้จะก่อให้เกิดการสร้างทั้งหมดในตัวมันเอง
engine-strict=true
npmrc ของคุณในตอนนี้มีผลเหมือนกัน
เพิ่ม
ถึง package.json
"engines": {
"node": ">=10.0.0",
"npm": ">=6.0.0"
},
ไปยังไฟล์.npmrc
(ใกล้กับpackage.json
ไดเรกทอรีเดียวกัน)
engine-strict=true
npm install
; ทำงานร่วมกับyarn
ได้เป็นอย่างดี
package.json
ด้วย "เอ็นจิ้น" ที่คล้ายกับข้างบน ( 11.13.0
และ6.7.0
) และ.npmrc
ไม่มีอะไรนอกจากเนื้อหาที่ระบุข้างต้น ฉันมี nvm เปลี่ยนให้ฉันเป็นโหนดรุ่นที่เก่ากว่าแล้ววิ่งnpm install
แต่มันก็แค่ติดตั้งการพึ่งพาและไม่ได้พูดถึงรุ่นเครื่องยนต์ไม่ตรงกัน
เช่นเดียวกับที่กล่าวถึงอิบัน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 เท่านั้น (และสคริปต์แบบเส้นด้าย)
.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
มีวิธีอื่นที่ง่ายกว่าในการทำสิ่งนี้:
npm install Node@8
(บันทึก Node 8 เป็นการพึ่งพาใน package.json)ใช้งานได้เพราะ node
เป็นเพียงแพ็คเกจที่จัดส่งโหนดเป็นไบนารีแพ็กเกจ มันรวมเป็น node_module / .bin ซึ่งหมายความว่าจะทำให้โหนดพร้อมใช้งานกับสคริปต์แพคเกจเท่านั้น ไม่ใช่เปลือกหลัก
ดูการสนทนาบน Twitter ได้ที่: https://twitter.com/housecor/status/962347301456015360
./node node-sass
node-sass
ไม่แน่ใจว่าเหมือนกันสำหรับไฟล์. bin ทั้งหมด
ตัวอย่างกรณีทดสอบ 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);
});});