Tôi biết đây là một câu hỏi cũ, nhưng tôi đã gặp phải vấn đề này khi cố gắng thực hiện một số phiên bản kiểm tra bằng cách sử dụng semver
một preinstall
tập lệnh trong package.json
. Vì tôi biết tôi không thể phụ thuộc vào bất kỳ mô-đun cục bộ nào được cài đặt, tôi đã sử dụng điều này để yêu cầu semver
từ node_modules
thư mục toàn cầu ( npm
tùy thuộc vào nó tôi biết nó ở đó):
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);
}
Tôi thích cách tiếp cận này vì nó không yêu cầu cài đặt bất kỳ mô-đun đặc biệt nào để sử dụng.
Tôi đã không đi với một NODE_PATH
giải pháp như những người khác đã đề xuất vì tôi muốn làm cho nó hoạt động trên máy của bất kỳ ai, mà không phải yêu cầu cấu hình / thiết lập bổ sung trước khi chạy npm install
cho dự án của tôi.
Cách thức này được mã hóa, nó chỉ được đảm bảo để tìm các mô-đun cấp cao nhất (được cài đặt bằng cách sử dụng npm install -g ...
) hoặc các mô-đun được yêu cầu bởi npm
(được liệt kê dependencies
tại đây: https://github.com/npm/npm/blob/master/package.json ). Nếu bạn đang sử dụng phiên bản NPM mới hơn, nó có thể tìm thấy sự phụ thuộc của các gói được cài đặt toàn cầu khác vì hiện tại có cấu trúc phẳng hơn cho node_modules
các thư mục.
Hy vọng điều này hữu ích cho ai đó.