code

npm package.json OS 특정 종속성

codestyles 2020. 12. 13. 09:33
반응형

npm package.json OS 특정 종속성


npm package.json 파일에 OS 특정 종속성을 지정하는 방법이 있습니까?

예를 들어, 사용자가 Linux를 실행중인 경우 내 모듈에 대한 종속성으로 'dbus'( https://npmjs.org/package/dbus ) 만 설치하고 싶습니다 . 나는 Mac과 Windows에 대해 다른 종속성을 가질 것입니다.


설정에 따라이 작업을 수행 할 수있는 좋은 방법이 있습니다.

npm package.json은 OS 키를 지원합니다 .

또한 선택 사항

  • os 모듈을 설치할 수있는 OS를 지정하는 데 사용할 수 있습니다.
  • optionalDependencies 설치할 수없는 경우 npm이이를 건너 뛰고 설치를 계속하는 모듈 종속성입니다.

이런 식으로 모듈이 각 OS에 대해 선택적 종속성을 가질 수 있으며 작동하는 모듈 만로드 / 설치됩니다 ^. ^

편집 : @Sebastien 아래에서 언급 했듯이이 접근 방식은 위험 합니다. 특정 OS의 경우 종속성 중 하나 이상이 "필수"이고 나머지는 "선택 사항"입니다. 모든 버전의 종속성을 선택 사항으로 만드는 것은 합법적 인 이유로 설치에 실패하는 경우 자동으로 설치를 건너 뛰고 실제로 필요한 종속성을 놓치는 것을 의미합니다.


짧은 대답은 '아니오'라고 생각합니다. 그래도 몇 가지 해결 방법을 생각할 수 있습니다. 가장 간단한 방법은 OS에 관계없이 package.json에 모든 것을 추가 한 다음 require()런타임에 올바른 것을 추가하는 것 입니다.

그래도 작동하지 않으면 설치 스크립트를 사용하여 원하는 결과를 얻을 수 있습니다-https: //docs.npmjs.com/misc/scripts

나는 이것을 테스트하지 않았지만 작동 할 것이라고 생각합니다.

package.json에 다음과 같이 추가하십시오.

,"scripts": {
  "install": "node install_dependencies.js"
}

그런 다음 install_dependencies.jsOS를 확인하고 적절한 npm install ...명령을 실행 하는 파일 을 추가하십시오 .


도 있습니다 바인딩 - shyp의 모듈은 :

https://www.npmjs.com/package/bindings-shyp

네이티브 모듈의 .node 파일을로드하기위한 도우미 모듈

Node.js 네이티브 애드온 모듈 작성자를위한 도우미 모듈입니다. 기본적으로 네이티브 모듈의 .node 파일을 require ()하는 "스위스 군용 칼"입니다.

Node의 기본 애드온 기록 과정에서 애드온은 어떤 빌드 도구와 어떤 버전의 노드가 사용되었는지에 따라 다양한 위치에서 컴파일되었습니다. 설상가상으로 이제 gyp 빌드 도구는 각각 다른 위치에 빌드되는 릴리스 또는 디버그 빌드를 생성 할 수 있습니다.

이 모듈은 네이티브 애드온이 빌드 될 수있는 모든 가능한 위치를 확인하고 성공적으로로드 된 첫 번째 위치를 반환합니다.


@npm_support 인용 :

https://twitter.com/npm_support/status/968195526989512705

2/2 의존성과 관련된 설치 문제를 피하고 싶다면, 한 가지 방법은 일반 의존성으로 필요한 래퍼를 작성하고 그것이 있는지 확인하는 것입니다 optionalDeps(또한 래퍼가 모든 것을 가지고 있는지 확인하는 것입니다). 일하는 데 필요).

그러나 IMHO는 실제 문제를 해결하는 것보다 해결 방법처럼 보입니다.

npm이 이식성을 유지하고 플랫폼 세부 사항을 처리하지 않기를 원하지만 어쨌든 수행해야하며 런타임에 IMHO를 수행하는 것은 최적이 아닙니다 (코드 크기를 최적화하려는 경우 전문성).

그래서 오늘 저는 공유 할 최적의 솔루션이 없지만 제안에 대한 공개 토론을합니다.

npm에서 "조건부 종속성"을 지원할 수 없습니까?

내 마음에 떠오른 첫 번째 일은 현재 구문 분석 된 섹션을 변경 (+ add, -remove, = replace) 할 "override"섹션을 추가하는 것이 었습니다.

예를 들면 :

dependencies: { "common-stuff": "*" } overrides: { "os: { linux: { dependencies: { "+best-linux-module" } } } }

그리고 내가 아는 개발자가 제안한 다른 옵션은 provides 키워드 를 도입하는 것입니다 . 그러면 여러 모듈이 resolver (la debian)가 만족하는 것과 동일한 의미를 제공 할 수 있지만 비슷한 오버 헤드를 생성합니다.

OS 지원뿐 아니라 다른 패키지 유형 (예 : 엔진에 따라 다름)에 초점을 맞춘 일반적인 접근 방식을 찾고 있습니다.

NPM 추적기의 관련 문제를 알고 있습니까? 그렇지 않은 경우 추적 할 버그를 제출할 예정입니다.

https://github.com/npm/npm/issues?q=dependencies+conditional

이 아이디어에 대한 피드백을 환영합니다.

참고 URL : https://stackoverflow.com/questions/15176082/npm-package-json-os-specific-dependency

반응형