ฉันรู้ว่านี้เป็นคำถามที่เก่า แต่ฉันวิ่งเข้าไปในนี้เมื่อพยายามที่จะทำบางการตรวจสอบรุ่นที่ใช้semver
ในสคริปต์ในpreinstall
package.json
เนื่องจากฉันรู้ว่าฉันไม่สามารถพึ่งพาโมดูลในพื้นที่ที่ติดตั้งไว้ฉันจึงใช้สิ่งนี้เพื่อต้องการsemver
จากnode_modules
โฟลเดอร์ทั่วโลก(ตามnpm
ที่ฉันรู้ว่ามีอยู่)
function requireGlobal(packageName) {
var childProcess = require('child_process');
var path = require('path');
var fs = require('fs');
var globalNodeModules = childProcess.execSync('npm root -g').toString().trim();
var packageDir = path.join(globalNodeModules, packageName);
if (!fs.existsSync(packageDir))
packageDir = path.join(globalNodeModules, 'npm/node_modules', packageName); //find package required by old npm
if (!fs.existsSync(packageDir))
throw new Error('Cannot find global module \'' + packageName + '\'');
var packageMeta = JSON.parse(fs.readFileSync(path.join(packageDir, 'package.json')).toString());
var main = path.join(packageDir, packageMeta.main);
return require(main);
}
ฉันชอบวิธีนี้เพราะไม่ต้องติดตั้งโมดูลพิเศษเพื่อใช้งาน
ฉันไม่ได้ไปด้วยNODE_PATH
วิธีแก้ปัญหาเหมือนที่คนอื่นแนะนำเพราะฉันต้องการให้มันทำงานบนเครื่องของทุกคนโดยไม่จำเป็นต้องมีการกำหนดค่าเพิ่มเติม / การตั้งค่าก่อนที่จะใช้npm install
สำหรับโครงการของฉัน
วิธีนี้จะถูกเข้ารหัสจะรับประกันได้ว่าจะหาโมดูลระดับบนสุด (ติดตั้งโดยใช้npm install -g ...
) หรือโมดูลที่ต้องการโดยnpm
(แสดงรายการdependencies
ที่นี่: https://github.com/npm/npm/npm/blob/master/package.json ) หากคุณกำลังใช้ NPM เวอร์ชันที่ใหม่กว่าอาจพบว่าการพึ่งพาแพ็กเกจที่ติดตั้งทั่วโลกอื่น ๆ เนื่องจากมีโครงสร้างที่ราบเรียบสำหรับnode_modules
โฟลเดอร์ในขณะนี้
หวังว่านี่จะเป็นประโยชน์กับใครบางคน