NODE_MODULE_VERSION ไม่ถูกต้องเมื่อใช้ ava

Nov 01 2020

ผมเขียนแอพพลิเคอิเลคตรอนที่ใช้nodegit สำหรับส่วนทดสอบของฉันฉันใช้avaร่วมกับ Spectron เพื่อทดสอบแอปของฉัน การทดสอบทั้งหมดของฉันใช้ได้ผล - รวมถึงฟังก์ชันที่ใช้nodegitในแอปของฉัน

นอกเหนือจากการทดสอบที่อธิบายไว้ข้างต้นแล้วฉันยังสร้างไฟล์ทดสอบที่ไม่ใช่อิเล็กตรอนบริสุทธิ์ซึ่งฉันนำเข้า nodegit โดยตรง

 import * as nodegit from 'nodegit';

การดำเนินการทดสอบนี้ตอนนี้ผ่านavaจะส่งคืนสิ่งนี้:

node_modules\.pnpm\[email protected]\node_modules\nodegit\build\Release\nodegit.node'
was compiled against a different Node.js version using
NODE_MODULE_VERSION 82. This version of Node.js requires
NODE_MODULE_VERSION 83. Please try re-compiling or re-installing
the module (for instance, using `npm rebuild` or `npm install`).
    at Module._extensions..node (internal/modules/cjs/loader.js:1122:18)

รุ่น 82 มาจากไหน? ฉันติดตั้งnodejs 14.15.0เท่านั้นซึ่งใช้เวอร์ชัน83ตามที่คาดไว้ เหตุใดโหนดจึงคิดว่าเวอร์ชันไม่ตรงกับที่ที่ใช้งานได้จริงในแอปของฉัน นี่คือpackage.jsonลักษณะของฉัน:

  "devDependencies": {
    "ava": "^3.13.0",
  },
  "scripts": {
    "ava": "node_modules/.bin/ava",
     ...
  },
  "ava": {
    "files": [
      "*.ts"
    ],
    "extensions": [
      "ts"
    ],
    "require": [
      "ts-node/register"
    ],
    "nodeArguments": [
      "--napi-modules",
      "--experimental-modules"
    ]
  },

ฉันสร้างnodegitตัวเองและในconfig.gypiไฟล์ยังอ้างถึง:

    "node_module_version": 83,

ฉันสร้างตัวอย่างที่ทำซ้ำได้ง่ายสุด ๆ : https://github.com/Githubber2021/node_module_version-issue

% node --version
14.15.0
% npm install
% npm run ava
... error

ใครช่วยอธิบายหน่อยได้ไหมว่านี่เป็นบั๊กหรือเวอร์ชัน 82 มาจากไหน

คำตอบ

1 Slbox Nov 19 2020 at 06:46

นี่อาจเป็นหนึ่งในสองสิ่ง:

  1. พึ่งพาพื้นเมืองคุณโหลดกำลังให้ไบนารีที่สร้างไว้ล่วงหน้าผ่านทางprebuild - นี้น่าจะเป็นกรณีที่
  2. การอ้างอิงดั้งเดิมที่คุณกำลังโหลดจะถูกดาวน์โหลดเป็นซอร์สโค้ดและการสร้างไบนารีนั้นขึ้นอยู่กับคุณ

ตาม README ของ nodegit

"NodeGit จะทำงานบนระบบส่วนใหญ่แบบสำเร็จรูปโดยไม่ต้องพึ่งพาเนทีฟใด ๆ "

แต่ดูเหมือนว่าคุณต้องมีขั้นต่ำ[email protected]ในการรับไบนารีที่สร้างไว้ล่วงหน้าจากการใช้ Node 14 Source

ดังนั้นสิ่งที่82คุณเห็นมาจากเวอร์ชัน ABI ที่ไบนารีที่สร้างไว้ล่วงหน้าถูกคอมไพล์ เนื่องจากคุณใช้งานอยู่[email protected]แล้วคุณจึงลงเอยด้วยไบนารีที่สร้างไว้ล่วงหน้าสำหรับ ABI ที่ไม่ถูกต้อง

นี่คือ repo ที่ฉันใช้ซึ่งแสดงรายการไบนารีต่างๆทั้งหมดสำหรับเวอร์ชันต่างๆดังนั้นคุณจะเห็นว่าสิ่งนี้อาจเกิดขึ้นได้อย่างไร: https://github.com/lovell/sharp/tree/v0.25.3

ผมพัฒนาในอิเลคตรอนและอิเล็กตรอนที่ผมใช้คำสั่งเช่นนี้จะได้รับรุ่นที่ถูกต้องของอิเลคตรอนที่จะทำงานnpm rebuildกับ

npm rebuild --runtime=electron --target=8.5.3 --disturl=https://atom.io/download/atom-shell

ฉันไม่รู้ว่าสิ่งที่เทียบเท่ากันสำหรับโหนดธรรมดาคืออะไร แต่ขอให้ฉันรู้ว่าสิ่งนี้ทำให้คุณเข้าใกล้มากขึ้นหรือไม่และฉันจะดูสิ่งที่ฉันหาได้

Pavel Nov 14 2020 at 21:01

เฮ้) ฉันคิดว่าฉันสามารถแก้ปัญหาของคุณได้ลองทำสิ่งนี้:

"engines": {
  "node": ">=14.0.0"
},

ไปยัง package.json ของคุณและลบ node_modules และทำ npm i ในไดเร็กทอรีโปรเจ็กต์ของคุณ ก็น่าจะช่วยได้