npm의 선택적 종속성?


23

나는 이것 과 비슷한 질문을 가지고 있지만 똑같지는 않습니다.

내 앱 사용자가 사용하려는 방식에 필요한 모든 종속성으로 앱을 설치하고 싶습니다. 예를 들어 MongoDB에 유지하려는 경우 Mongo 관련 라이브러리 만 설치되지만 Redis에 유지하려는 경우 Redis 관련 라이브러리 만 설치됩니다. 사용하지 않을 라이브러리를 다운로드하여 설치하고 싶지 않습니다.

나는 개발 목적으로 그것을 할 수 있다는 것을 알고 devDependencies있지만, 이것보다 먼 곳입니다. 위의 질문에 대한 답변에서 알 수 있듯이 이것은 Python setuptools extras_require및 Clojure의 leiningen프로필 과 더 밀접한 관련이 있습니다. npm에 그런 것이 있습니까? 나는 의존성을 지정하는보다 다재다능한 방법의 프로파일 devDependencies이어야한다고 생각합니다 dev.


그냥 생각하지만 여러 패키지를 사용할 수 있습니다. MyPackage-Core MyPackage-Db-Mongo MyPackage-Db-Redis등 ... 그들은 사람들이 angularjs확장 하는 bower 모듈을하는 방식을 많이 사용 합니다.
Mike

@ 마이크 : 흠 감사합니다. 고려하겠습니다. 나는 이것이 이것이 package.json다른 패키지 관리자에서 해결 된 한계라고 생각 합니다.
imiric

1
이것은 좋은 질문이지만 도구를 사용하는 것에 관한 주제가 아닌 것 같습니다. 이러한 질문은 도구가 일부 개발 프로세스에 통합되는 방식을 다루는 경우에만 주제에 관한 것입니다. 결국이 사이트는 소프트웨어 엔지니어링에 관한 것입니다. 자세한 내용은 도움말 센터 를 참조하십시오. 읽어보십시오 : 도구 질문은 어디에 있습니까? NPM과 같은 개발 도구의 사용법은 Stack Overflow에 관한 주제입니다.
amon

답변:


9

상호 의존 모듈은 당신이 찾고, 또는 유사한 무언가를 무엇을하는지 할 수있다 :

  • 선택적인 종속성을 선언 하지 않는 자동으로 설치를 말하자면,package.jsonnpm installoptionalPeerDependencies
  • 필요한 모듈 클래스를 충족하지 않는 것이 발견되면 던지기 / 경고를 포함하여 올바른 것을 require알고 올바르게 하는 사용자 정의 스타일 함수 optionalPeerDependencies(예 : redis, 또는 mongo, 또는 mysql등이 설치 되지 않음 )
  • 이 모듈의 소비자가 선택적인 피어 모듈 중 적어도 하나를 설치할 것이라는 예상을 문서화하십시오.

한 가지 변형은 모듈의 핵심 기능이 선택적 종속성 (예 : 플러그인 패턴)없이 작동하고 피어 종속성을 충족시키는 것이 발견되지 않을 때 오류 / 경고가없는 경우입니다.

또 다른 변형은 위의 목록을 작성하는 동안 생산 및 개발 종속성 (예 : dependencies및에 대한 아날로그)을 설명하는 것 devDependencies입니다.

주문형 옵션과 결합하여 옵션 모듈이 느리게 요구 될 수 있습니다. 예 :

exports = {
    Core : require('./core'),
    get redis(){ return require('./redis'); },
    get mongo(){ return require('./mongo'); }
}

나는 이것을 잠시 동안 필요로하지 않았지만 그것이 내가 가진 문제를 해결한다고 생각합니다. 감사!
imiric

2
네, 아마 몇 달이 지났을 것 같아서 아마 알아 내거나 넘어 갔을 것입니다. 답변을 직접 검색하는 동안 귀하의 질문을 찾았으므로 대부분 후손을위한 것입니다. 몇 년 전에 작성된 답을 찾기 위해 검색을 한 번 이상했습니다. 따라서이 깨달은 자기 관심을 고려하십시오. 또한, codependencyNPM에서 모듈이 증발하는 경우와 발췌가없는 링크는 SO 형식이 좋지 않기 때문에 일반적으로 모듈이 제공 하는 내용을 설명하도록 답변을 업데이트했습니다 .
toolbear

9

플러그인과 같은 간단한 선택적 종속성을 원한다면, 예를 들어 foo를 설치하면 색상을 실행하지만 설치되지 않은 경우 아무런 문제가 없으며 회색 으로 표시되면 package.json에서 optionalDependecies를 사용할 수 있습니다 .

{
  "name": "watchit",
  "version": "1.2.3",
  "optionalDependencies": {
    "foo": "^2.0.0"
  }
}

그리고 코드에서 :

try {
  var foo = require('foo')
  var fooVersion = require('foo/package.json').version
} catch (er) {
  foo = null
}
if ( notGoodFooVersion(fooVersion) ) {
  foo = null
}

// .. then later in your program ..

if (foo) {
  foo.doFooThings()
}

package.json 문서 에서 추출되었습니다 .


1

내가하는 일은 내 package.json scripts에서 다음과 같이 설치 스크립트를 구성하는 것입니다 .

"install": "node ./my-tools/my-install.js",

npm install완료 직후 실행됩니다 . 나는 자동 생성하기 위해 주로 사용 .env기본값으로 파일을.

my-install.js스크립트는 그래서 당신은 말할 수, 사용자 입력을 요청, 파일을 생성, 다른 명령을 실행할 수 있습니다 "레디 스 또는 몽고을 원하십니까?"

const exec = require('child_process').exec;
const readline = require('readline');

// Insert "Ask question script" here
// using readline core module

if ( option == 'mongo' )
  exec('npm install mongoose');

if ( option == 'redis' )
  exec('npm install redis');

이것은 매우 빠른 대답입니다. 사용자 입력을 올바르게 읽으 려면 readline 을 확인하고 명령을 실행하고 출력을 처리하는 하위 프로세스 등을 확인하십시오.

또한 설치 스크립트는 원하는대로 할 수 있습니다 (파이썬, bash 등)


2
사용자 입력을 요구하면 자동화 된 빌드가 망치게됩니다. npm install설치 스크립트 내에서 다시 실행 하면 의도하지 않은 동작이 발생할 수도 있습니다. 이 솔루션을 권장하지 않습니다.
Lambda Fairy

1

npm은 의존성 관리의 가장 어려운 부분 중 하나가 쉽고 비교적 안전한 안전하고 빠르고 재현 가능한 빌드를 보장하기 때문에 실제로는 이것을 위해 설계되지 않았습니다. 그러나 나는 유스 케이스가 있다고 생각하며 확실히 나에게도 있었다. 그래서 나는 당신이 요구하는 것을 정확하게하기 위해 패키지를 썼습니다.

내 패키지는 install-subset입니다.npm install -g install-subset

https://www.npmjs.com/package/install-subset

먼저 package.json에서 명명 된 설치 하위 세트에 대한 화이트리스트 및 블랙리스트를 다음과 같이 빌드합니다.

"subsets": {
    "build": {
        "whitelist": [
            "babel-cli",
            "dotenv"
        ]
    },
    "test": {
        "blacklist": [
            "eslint",
            "lint-rules",
            "prettier"
        ]
    }
}

그런 다음 예를 들어 install-subset test

이렇게하면 package.json이 일시적으로 다시 작성되어 블랙리스트에있는 패키지를 설치하지 않은 다음 패키지를 복원하면 패키지에 따라 많은 시간과 대역폭을 절약 할 수 있습니다.

또한 원사와 함께 작동하며 오픈 소스이며 이슈 / PR을 환영합니다.

많은 경우에 나는 이것을 ci 서버에서 빌드 시간을 낮추기 위해 사용하고 최신 React Native 프로젝트에서 일반적인 새로운 개발자 설치를 72 초에서 약 20 초로 수행했습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.