npm에서 글로벌 패키지에 대해 기본적으로 루트 권한이 설정된 디렉터리가 있는 이유는 무엇입니까?

npm에서 글로벌 패키지에 대해 기본적으로 루트 권한이 설정된 디렉터리가 있는 이유는 무엇입니까?

저는 현재 Angular와 npm을 배우고 있습니다. 오늘 나는 Fedora에서 작업을 시도했지만 npm i -g @angular/cli이를 설치하는 대신 터미널에서 보았습니다(편의를 위해 메시지를 줄였습니다).

npm WARN checkPermissions Missing write access to /usr/lib/node_modules

그래서 구글에서 무슨 뜻인지 확인해 봤습니다. 나는 찾았다이 npm 설명, 그리고 이 기사가 나를 이끌었습니다.또 다른 npm 기사이 오류를 더 자세히 설명합니다. 후자의 기사에서는 다음과 같이 기술했습니다.

패키지를 전체적으로 설치하려고 할 때 EACCES 오류가 표시되면 다음 중 하나를 수행할 수 있습니다.

노드 버전 관리자를 사용하여 npm을 다시 설치합니다(권장).

또는

npm의 기본 디렉토리를 수동으로 변경

빠른 수정으로 위의 두 솔루션 모두 괜찮아 보였습니다.

하지만 Linux를 사용해 본 경험이 있기 때문에 다음과 같은 의문이 들기 시작했습니다. 왜 다른 소프트웨어를 설치해야 하는지, 아니면 왜 일부 구성을 변경해야 합니까? 다르게 말하면, 왜 npm의 기본 구성과 Fedora의 기본 구성에서 오류가 발생하지 않도록 둘 중 하나라도 조정해야 합니까?

스스로에게 이러한 질문을 던진 후, 해당 사례가 내 npm 구성에 있을 수 있다고 생각했습니다. 아마도 설치 이후 아무것도 변경하지 않았을 것입니다. 하지만 누가 알겠습니까? 그래서 npm을 다시 설치하기로 결정했습니다. 확실히 제거 후 컴퓨터를 재부팅했습니다. 재설치 후 npm i -g @angular/cli다시 시도했지만 동일한 오류가 발생했습니다.

그러다가 생각했습니다. npm의 경우가 아닐 수도 있고, Fedora 설치의 경우일 수도 있지 않을까요? 나는 그런 이유로 Fedora를 다시 설치하고 싶지 않았습니다. 그래서 저는 Fedora의 디렉토리에 대한 기본 권한이 /usr/lib/node_modules기본적으로 설정되어 있는지 Google에서 확인했습니다. 내 디렉터리의 경우 /usr, /usr/lib/usr/lib/node_modules(심지어 의 경우에도 /usr/lib/node_modules/npm) 소유자와 그룹이 있었고 root root소유자만 쓰기 권한을 가졌습니다. 내가 찾은 유일한 소스는 "Fedora 26 설치 가이드"(Fedora 29가 설치되어 있지만)였고 그 문서는 나에게 다음을 검토하라고 조언했습니다.파일 시스템 계층 표준 2.3디렉토리 구조에 대해. node_modulesnpm이 원하는 권한을 정확히 할당했을 것으로 예상했기 때문에 /usr/usr/lib. 디렉토리 의 경우 /usrFHS는 권한에 대해 아무 것도 언급하지 않은 것 같습니다. 디렉토리 에 대해 /usr/lib다음과 같이 명시했습니다.

/usr/lib에는 사용자나 쉘 스크립트가 직접 실행할 수 없는 개체 파일, 라이브러리 및 내부 바이너리가 포함되어 있습니다. [22]

이 정보도 별로 도움이 되지 않았습니다.

결국 저는 제가 받은 오류의 실제 원인이 무엇인지 아직도 이해하지 못한다는 결론에 도달했습니다. 그렇다면 이제 저는 이렇게 묻고 싶습니다.

  1. npm은 새 패키지를 넣는 방식으로 기본적으로 구성되어야 합니까 /usr/lib/node_modules?
  2. 그렇다면 Fedora가 해당 디렉터리에 대해 가져야 하거나 가져야 하거나 가질 수 있는 다른 기본 권한을 설정했습니까?
  3. 그렇지 않다면 실수로 해당 디렉터리에 대한 Fedora 설치 권한을 변경했을 수도 있습니까?
  4. 아니요, 루트 권한으로 npm 패키지를 설치하지 않은 경우인가요? 이 역시 수정된 것으로 보이지만 npm 문서에는 그러한 솔루션이 언급되어 있지 않습니다.
  5. 그렇지 않다면, npm 패키지를 전역적으로 설치하려고 시도한 것인가요? 그렇다면 왜 그런 가능성이 있는 걸까요?
  6. 제가 이해하지 못하는 부분이 있거나 누락된 부분이 있나요? 어쩌면 (최신) 문서가 부족한 것일 수도 있습니다.

업데이트:루트가 아닌 일반 사용자로 모든 명령을 실행한다는 점을 잊어버렸습니다.

답변1

어떤 사용자로 실행했는지는 밝히지 않았지만 루트가 아닌 것으로 가정합니까? 어떤 경우에는 오류가 정확하지만 일반 사용자가 시스템 디렉터리에 설치할 수 없어야 하기 때문에 예상되는 오류이기도 합니다.

NET npm에서 rpm 관리 모듈과 npm 관리 모듈이 혼란스러워질 수 있기 때문에 Fedora 패키지 Node.js를 사용하여 전역적으로 패키지를 설치하는 데 사용해서는 안 됩니다 /usr/lib/node_modules.

/usr불행하게도 다른 언어 환경과 달리 Node.js는 두 개의 별도 전역 모듈 디렉토리( 시스템 패키징에서 관리하는 모듈용 하나와 언어 환경의 자체 도구로 관리되는 모듈용)를 지원하지 않으므로 /usr/local이 작업을 수행할 수 없습니다. 우리가 원하지 않는 광범위한 npm 패치 없이 합리적인 방법입니다. 이러한 분할이 가능하더라도 Perl, Python 또는 Ruby에서와 마찬가지로 전역 설치를 수행하려면 루트 권한이 필요합니다.

내가 이해한 대로 Node.js에서는 전역 설치를 권장하지 않습니다. 업스트림의 관점에서는 프로젝트에 필요한 모듈만 각 프로젝트에 로컬로 설치해야 한다는 것입니다.

관련 정보