programing

NodeJS에는 글로벌 모듈/패키지가 필요합니다.

lovejava 2023. 5. 24. 21:21

NodeJS에는 글로벌 모듈/패키지가 필요합니다.

전적으설다사합고니려다용하음체치로한합니다를 사용하려고 forever그리고.forever-monitor다음과 같이:

npm install -g forever forever-monitor

경로에 되지만, 가 " 일반인출파글경을로복벌로만면작지는시표", "하같도이과다음되시업도"를 한다면,require("forever");모듈을 찾을 수 없다는 오류가 발생합니다.

노드와 npm의 최신 버전을 모두 사용하고 있으며 글로벌 설치와 로컬 설치에서 npm이 변경된 것은 이미 알고 있지만 모든 프로젝트에 localy를 설치하고 싶지는 않으며 지원하지 않는 플랫폼에서 작업하고 있습니다.link그렇게npm link글로벌 설치가 불가능한 후.

제 질문은 글로벌하게 설치된 패키지를 필요로 하지 않는 이유입니다.그게 특징입니까, 아니면 버그입니까?아니면 제가 뭔가 잘못하고 있나요?

PS: 분명히 말씀드리자면,로컬로 설치하지 않습니다.

Node.js에서 require는 글로벌 모듈이 설치된 폴더를 찾지 않습니다.

NODE_PATH 환경 변수를 설정하여 이 문제를 해결할 수 있습니다.Linux에서 이는 다음과 같습니다.

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가 프로젝트 디렉토리에 포함된 모든 자바스크립트를 "컴파일"하려고 하는 것을 고려하면 나는 정말로 어떤 패키지도 설치할 수 없습니다.

설명서에 따르면 Node.js는 기본적으로 다음 위치에서 검색합니다.

  1. 환경 변수에 지정된 경로입니다.

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

  2. 현재 폴더입니다.(로컬)

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

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

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

    참고:$PREFIX된 Node.js 파일입니다.node_prefix.

    node_prefix선택사항:

    node -p process.config.variables.node_prefix
    

    는 " " " " " "에 합니다.--prefix빌드 중에 매개 변수가 있고 이 매개 변수는 다음과 관련이 있습니다.process.execPath가치와 혼동하지 않기 위해서입니다.npm config get prefix지휘권source

지정된 모듈을 찾을 수 없으면 위의 위치 중 하나에 모듈이 없음을 의미합니다.

는 다음과 같이 할 수 npm root -g(파일에서 재정의되지 않는 한 기본적으로 경로는 런타임에 계산됩니다.)

해결책

다음 해결 방법을 시도할 수 있습니다.

  • 에서 글로벌 모듈 위치를 합니다.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 -
    
  • userconfig 파일에서 글로벌 설치 대상을 구성합니다(다음 참조).npm help 5 npmrc )에 의해 는또▁byuserconfig매개 변수(--prefix).

    구성을 하려면 다음을합니다.npm config list.

    현재 구성을 편집하려면 다음을 실행합니다.npm config edit.

  • 호출 시 노드 모듈 위치의 전체 경로 지정require()를 들어 예를 .

    require("/path/to/sub/module")
    
  • 패키지를 사용자 지정 위치에 설치합니다(예:

    npm install forever -g --prefix "$HOME"/.node_modules
    

    그나설진니다됩행는치러다▁go로 진행됩니다.~/.node_modules/lib/node_modules/위치를 추가해야 합니다.

    참조: 사용자 지정 위치에 npm 로컬 설치 패키지

  • 전역 패키지의 위치에서 현재 폴더에 심볼 링크를 만듭니다.예.

    npm link forever
    

오래된 질문인 것은 알지만 버전 확인을 수행할 때 다음을 사용하여 이 문제를 사용하여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폴더를 선택합니다.

이것이 누군가에게 유용하기를 바랍니다.

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

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

할 수 있을 겁니다

또한, 글로벌 사용에만 국한된 또 다른 모듈이 있습니다.npm당신은 짧은 코드를 보고 그 기술이 어떻게 작동하는지 볼 수 있습니다.

모듈에 , 를 들어 CLI는 다음과 같습니다.puppeteer나는 산란하는 것을 좋아합니다.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)
}

의 당은이당라에 이 수 ..profile파일 이름:

NODE_PATH="$(npm 구성 접두사 가져오기)/lib/node_node" 내보내기

이것은 만들 것입니다.node전역 경로를 사용합니다.

나는 다른 답들을 따르려고 노력했지만 나에게 효과가 있었던 것입니다.

      node_path = "C:\\Users\\{usename}\\AppData\\Roaming\\npm\\node_modules"
      const *modulename* = require(node_path + "\\" +'*modulename*');

언급URL : https://stackoverflow.com/questions/15636367/nodejs-require-a-global-module-package