[node.js] NodeJS는 글로벌 모듈 / 패키지를 필요로합니다

전 세계적으로 설치 한 다음 다음 foreverforever-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가 프로젝트 디렉토리에 포함 된 모든 자바 스크립트를 “컴파일”하려고한다고 생각하면 실제로 패키지를 설치할 수 없습니다.


답변

나는 이것이 오래된 질문이라는 것을 알고 있지만 semverpreinstall스크립트에서 버전 확인을 시도 할 때이 문제가 발생 했습니다 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를 기본적으로 다음 위치에서 검색합니다 :

  1. NODE_PATH환경 변수에 지정된 경로 .

    참고 : NODE_PATH환경 변수는 콜론으로 구분 된 절대 경로 목록으로 설정됩니다.

  2. 현재 node_modules폴더. (현지)

  3. $HOME/.node_modules (글로벌)

    참고 : $HOME사용자의 홈 디렉토리입니다.

  4. $HOME/.node_libraries (글로벌)
  5. $PREFIX/lib/node (글로벌)

    참고 : $PREFIXNode.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 -
  • npmuserconfig 파일 (: 참조 npm help 5 npmrc) 또는 userconfigparam ( --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 로컬 설치 패키지를 사용자 정의 위치로

  • 글로벌 패키지의 위치에서 현재 폴더에 심볼릭 링크만듭니다 . 예 :

    npm link forever

답변

패키지 requireg를 사용 하여이 문제를 해결할 수 있습니다 .

var forever = require('requireg')('forever')

트릭을 할 것입니다.

또한 global-npmglobal을 사용하는 것과 관련된 다른 모듈이 npm있지만 짧은 코드 를보고 기술이 어떻게 작동하는지 확인할 수 있습니다.


답변

와 같은 큰 모듈에 의존하는 CLI 유틸리티의 경우 puppeteera를 생성 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)
}