전 세계적으로 설치 한 다음 다음 forever
과 forever-monitor
같이 사용하려고합니다 .
npm install -g forever forever-monitor
일반적인 출력과 파일을 전역 경로로 복사하는 작업도 보지만 시도 require("forever");
하면 모듈을 찾을 수 없다는 오류가 발생합니다.
노드와 npm의 최신 버전을 사용하고 있으며 전역 및 로컬 설치에서 npm의 변경 사항에 대해 이미 알고 있지만 모든 프로젝트에 로컬을 설치하고 싶지 않으며 플랫폼이 아닌 플랫폼에서 작업하고 있습니다. ‘t 지원 link
하므로 npm link
설치 전역 후 나를 위해 할 수 없습니다.
내 질문은 : 전 세계적으로 설치된 패키지를 요구할 수없는 이유는 무엇입니까? 기능입니까, 버그입니까? 아니면 내가 잘못하고 있습니까?
추신 : 그냥 명확하게하기 위해 : 로컬로 설치하고 싶지 않습니다.
답변
Node.js에서 require는 전역 모듈이 설치된 폴더를 찾지 않습니다.
NODE_PATH 환경 변수를 설정하여이 문제를 해결할 수 있습니다. 리눅스에서 이것은 :
export NODE_PATH=/usr/lib/node_modules
참고 : 이것은 전역 모듈이 실제로 설치된 위치에 따라 다릅니다.
전역 폴더에서로드를 참조하십시오 .
답변
전역으로 패키지를 설치 한 후에는 로컬 프로젝트를 전역 패키지와 연결해야합니다
npm install express -g
cd ~/mynodeproject/
npm link express
답변
네크로 맨시에 사과하지만 전 세계적으로 설치된 모듈에 대한 하드 코딩 된 경로를 지정할 수 있습니다.
var pg = require("/usr/local/lib/node_modules/pg");
이것은 완벽하지는 않지만 Unity3d가 프로젝트 디렉토리에 포함 된 모든 자바 스크립트를 “컴파일”하려고한다고 생각하면 실제로 패키지를 설치할 수 없습니다.
답변
나는 이것이 오래된 질문이라는 것을 알고 있지만 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/blob/master/package.json ). 최신 버전의 NPM을 사용하는 경우 node_modules
폴더에 대한 구조가 더 평평하므로 전세계에 설치된 다른 패키지의 종속성을 찾을 수 있습니다.
이것이 누군가에게 유용하기를 바랍니다.
답변
당으로 문서 , Node.js를 기본적으로 다음 위치에서 검색합니다 :
-
NODE_PATH
환경 변수에 지정된 경로 .참고 :
NODE_PATH
환경 변수는 콜론으로 구분 된 절대 경로 목록으로 설정됩니다. -
현재
node_modules
폴더. (현지) -
$HOME/.node_modules
(글로벌)참고 :
$HOME
사용자의 홈 디렉토리입니다. $HOME/.node_libraries
(글로벌)-
$PREFIX/lib/node
(글로벌)참고 :
$PREFIX
Node.js가 구성되어 있습니다node_prefix
.의 현재 값을 확인하려면
node_prefix
다음을 실행하십시오.node -p process.config.variables.node_prefix
참고 : 접두사는
--prefix
빌드 중 param에 해당하며에 상대적process.execPath
입니다.npm config get prefix
명령의 값과 혼동하지 마십시오 . 출처
지정된 모듈을 찾을 수 없으면 위의 위치 중 하나에 해당 모듈이없는 것입니다.
모듈이 설치된 전역 루트 폴더의 위치는 다음과 같이 인쇄 할 수 있습니다 npm root -g
(기본적으로 npmrc
파일 에서 재정의되지 않는 한 경로는 런타임에 계산 됨 ).
해결책
다음 해결 방법을 시도 할 수 있습니다.
-
NODE_PATH
환경 변수 에 글로벌 모듈 위치를 지정하십시오 . 예 :echo 'require("forever")' | NODE_PATH="$(npm root -g):$NODE_PATH" node
의 값을 테스트하고 인쇄하려면
NODE_PATH
다음을 실행하십시오.echo 'console.log(process.env.NODE_PATH); require("forever")' | NODE_PATH="$(npm root -g):$NODE_PATH" node
-
보다 영구적 인 솔루션을 얻으려면
$HOME/.node_modules
다음 명령을 실행 하여 글로벌 사용자 폴더를 루트 폴더를 가리 키도록 연결하십시오 .ln -vs "$(npm root -g)" "$HOME"/.node_modules
그런 다음
echo 'require("forever")' | node
명령을 통해 다시 테스트하십시오 . -
스크립트를 호출하기 전에 현재 폴더를 확장 프로그램이 전역에 설치된 위치로 임시 변경하십시오. 예 :
npm install -g forever cd "$(npm root -g)" echo 'require("forever")' | node cd -
-
npm
userconfig 파일 (: 참조npm help 5 npmrc
) 또는userconfig
param (--prefix
)으로 글로벌 설치 대상을 구성 하십시오 .현재 구성을 표시하려면 다음을 실행하십시오
npm config list
..현재 구성을 편집하려면 다음을 실행하십시오
npm config edit
.. -
호출 할 때 노드 모듈 위치 의 전체 경로를 지정하십시오
require()
. 예 :require("/path/to/sub/module")
-
사용자 정의 위치에 패키지를 설치하십시오 (예 :
npm install forever -g --prefix "$HOME"/.node_modules
그러나 설치는 아래로 진행
~/.node_modules/lib/node_modules/
되므로 위치를 추가해야합니다. -
글로벌 패키지의 위치에서 현재 폴더에 심볼릭 링크 를 만듭니다 . 예 :
npm link forever
답변
패키지 requireg
를 사용 하여이 문제를 해결할 수 있습니다 .
var forever = require('requireg')('forever')
트릭을 할 것입니다.
또한 global-npm
global을 사용하는 것과 관련된 다른 모듈이 npm
있지만 짧은 코드 를보고 기술이 어떻게 작동하는지 확인할 수 있습니다.
답변
와 같은 큰 모듈에 의존하는 CLI 유틸리티의 경우 puppeteer
a를 생성 npm root -g
하고 전역 모듈이 필요합니다.
try {
const root = require('child_process').execSync('npm root -g').toString().trim()
var puppeteer = require(root + '/puppeteer')
} catch (err) {
console.error(`Install puppeteer globally first with: npm install -g puppeteer`)
process.exit(1)
}