npm을 사용하여 여러 버전의 패키지를 설치하는 방법


103

https://github.com/npm/npm/issues/2943 으로 인해 npm은 패키지 별칭을 지정하고 동일한 패키지의 여러 버전을 설치하는 기능을 지원하지 않습니다.

github 문제에 게시 된 해결 방법은 순수 JS 모듈에서 작동 할 수 있지만 npm이 프런트 엔드 패키지 관리의 표준이되면서 이제 패키지에는 CSS와 같은 다양한 자산이 포함됩니다.

동일한 패키지의 여러 버전을 설치하는 해결 방법이 있습니까?

제가 생각 해낸 최고의 아이디어는 패키지를 "복제"하고 약간 다른 이름으로 게시하는 것입니다.

당신의 여러 버전을 필요로하는 경우 예를 들어 jquery, 당신은 단지라는 패키지를 게시 할 수 있습니다 jquery-alias1, jquery-alias2, jquery-alias3등, 다음에 해당하는 버전을 설정합니다 package.json.

또는 당신은 자신의 버전 번호, 예에 따라 패키지의 이름을 수 jquery-1.11.x, jquery-2.1.x, 등

이 두 접근 방식은 모두 조잡 해 보입니다. 더 나은 것이 있습니까?


이것을 쉽게 할 수있는 프론트 엔드 패키지 관리의 표준이 아닙니다 .
laggingreflex

예, 정자는 여기서 대안처럼 보입니다. 큰 팀에 다른 패키지 관리 시스템을 도입하는 것이 어려울 수 있으므로 npm 솔루션이없는 것 같아서 너무 안타깝습니다. 특히 npm을 지원하도록 설정된 인프라가 이미있는 경우 (예 : 개인 npm 레지스트리 서버)
Mark

답변:


109

현재 NPM v6.9.0, NPM은 이제 패키지 별명을 지원합니다. 그것은 동일한 구문 구현 원사를 사용하므로 :

npm install jquery2@npm:jquery@2
npm install jquery3@npm:jquery@3

다음을 추가합니다 package.json.

"dependencies": {
   "jquery2": "npm:jquery@^2.2.4",
   "jquery3": "npm:jquery@^3.4.1"
}

이 구문을 사용하여 GitHub에서 직접 설치할 수도 있습니다. 예를 들어 npm 레지스트리 버전과 패키지의 GitHub 포크를 모두 설치하려는 경우 foobar:

npm install foobar
npm install foobar-fork@github:username/foobar

1
yarn 은 또한 패키지 앨리어싱 을 지원 합니다
Greg K

안녕하세요, 저는 2 개의 패키지를 설치하기 위해이 단계를 시도했습니다 : "react-native-track-player": "1.1.4"및 "react-native-track-player": "1.1.8". iOS에서는 잘 작동하지만 Android에서는 "MusicManager $ 1이 여러 번 정의되어 있습니다."라는 오류가 표시됩니다. Android가 1.1.8을 빌드하지 못하도록하려면 어떻게해야합니까?
EmBeCoRau

라이브러리의 일부 충돌 때문에 iOS에서는 1.1.8, Android에서는 1.1.4를 사용해야합니다
EmBeCoRau

그것은 즉, 그것을 찾고 있었다 찾던로 달랐다 의존성의 별칭으로 나를 위해없는 일했다 eslint,하지만 지금은 이름을 몰랐어요eslint6
Crimbo

75

나는 Yarn을 사용 하고 여기에 착륙 한 나와 같은 사람을 위해 여기에 게시하고 싶었습니다 . 즉시 앨리어싱을 지원하는 NPM의 대체품입니다.

yarn add material-ui@latest
yarn add material-ui-next@npm:material-ui@next
then

import FlatButton from 'material-ui/FlatButton'; // v0.x
import Button from 'material-ui-next/Button'; // v1.x

(예를 들어 크레딧은 https://github.com/callemall/material-ui/issues/7195#issuecomment-314547601이동합니다. )


17
감사합니다. 일반 공식을 명확히하기 위해 <alternative-name>@npm:<package-name>@<version>
NikosKeyz

5

"JSPM"이 귀하가 찾고있는 도구 인 것 같습니다. JSPM은 NPM 위에 빌드되지만 여러 소스 (github, npm 등)에서 패키지를 가져올 수 있습니다. 모듈을로드하기 위해 프런트 엔드에 System.js 범용 모듈 로더를 사용하고 추론하기 쉬운 "플랫 버전 관리를 사용하여 버전 접미사가있는 폴더로 다운로드"합니다.

jspm.io

jspm을 사용하여 패키지를 설치할 때 해당 패키지의 별칭을 특정 이름으로 지정할 수 있으며 나중에 require모듈에서 구체적으로 지정할 수 있습니다 .

$ jspm install jquery
... (status msgs) ...
ok   Installed jquery as github:components/jquery@^2.1.4 (2.1.4)

$ jspm install jqueryOne=jquery@1.11.3
... (status msgs) ...
ok   Installed jqueryOne as github:components/jquery@1.11.3 (1.11.3)

      github:components/jquery 1.11.3 2.1.4

그런 다음 js에서 필요에 따라 간단하게 require(jquery)또는 require(jqueryOne)필요에 따라 앞뒤로 이동할 수 있습니다.

여러 버전을 사용하려는 모든 패키지에 동일하게 적용됩니다.


2

이것은 npm이 작동하는 방식으로 인해 깔끔하게 수행하기가 매우 어렵 기 때문에 프로덕션에서 시도하지 않을 것입니다.

그러나 통합 테스트 및 유사한 사용 사례 를 위해 동일한 패키지의 여러 버전을 설치할 수있는 multidep 이라는 패키지를 만들었습니다 require.

var multidepPackages = require('multidep')('test/multidep.json');

var jquery1 = multidepRequire('jquery', '1.11.3');
var jquery2 = multidepRequire('jquery', '2.1.4');

0

NPM 설치 버전 ( https://github.com/scott113341/npm-install-version )도 옵션입니다. 본질적으로 여기에있는 다른 솔루션 중 일부 (기술적으로 말하면)를 수행하지만 사용하기가 매우 간단합니다. 버전 번호 (NPM에서 사용하는 표준 @version 명령 매개 변수)로 설치된 모듈 은 해당 이름의 node_modules 아래의 하위 폴더에 예상대로 설치됩니다 . 모듈 당 대상 디렉토리를 제어 할 수도 있습니다. 이는 빌드 시스템에 유용합니다.

GitHub 문서의 사용 코드 스 니펫 :

const niv = require('npm-install-version');
const benchmark = require('./some-benchmark-function.js');

niv.install('csjs@1.0.0');
// installs csjs@1.0.0 to node_modules/csjs@1.0.0/

niv.install('csjs@1.0.1');
// installs csjs@1.0.1 to node_modules/csjs@1.0.1/

const csjs_old = niv.require('csjs@1.0.0');
const csjs_new = niv.require('csjs@1.0.1');
// require the old and new versions of csjs

benchmark([csjs_old, csjs_new], 'some-test-input');
// run our fake benchmark function on the old and new versions of csjs

0

install-npm-version( https://github.com/scott-lin/install-npm-version )은 또 다른 옵션입니다. 명령 줄 또는 최신 개발을 위해 TypeScript로 작성된 프로그래밍 인터페이스를 통해 사용할 수 있습니다.

예제 # 1 : 버전이 지정된 (기본) 디렉토리에 설치

import inv = require('install-npm-version');

inv.Install('chalk@2.4.0');
// installs chalk@2.4.0 to node_modules/chalk@2.4.0/

inv.Install('chalk@2.4.1');
// installs chalk@2.4.1 to node_modules/chalk@2.4.1/

예제 # 2 : 사용자 지정 디렉터리에 설치

import inv = require('install-npm-version');

inv.Install('chalk@2.4.0', { 'Destination': 'some/path/chalk' });
// installs chalk@2.4.0 to node_modules/some/path/chalk/

예제 # 3 : 조용하거나 시끄러운 표준 출력으로 설치

import inv = require('install-npm-version');

inv.Install('chalk@2.4.0', { 'Verbosity': 'Silent' });
inv.Install('chalk@2.4.0', { 'Verbosity': 'Debug' });

예제 # 4 : 기존 설치 덮어 쓰기

import inv = require('install-npm-version');

inv.Install('chalk@2.4.0', { 'Destination': 'mydir' });
// installs chalk@2.4.0 to node_modules/mydir/

inv.Install('chalk@2.4.1', { 'Destination': 'mydir' });
// does not install chalk@2.4.1 since node_modules/mydir/ already exists

inv.Install('chalk@2.4.1', { 'Destination': 'mydir', 'Overwrite': true });
// installs chalk@2.4.1 to node_modules/mydir/ by overwriting existing install

0

제 경우에는 과제에이 이전 버전이 필요한 과정을 수강했기 때문에 전 세계적으로 설치 한 버전보다 이전 버전의 create-react-app을 설치해야했습니다.

이 이전 버전을 포함하기 위해 새 폴더를 만들고 그 안에 CD를 넣고

npm init

이 셸 package.json을 설정 한 후 필요한 정확한 버전의 create-react-app을 설치했습니다.

npm install create-react-app@1.5.2

이전 버전의 create-react-app으로 로컬 node_modules 폴더를 생성했습니다.

그런 다음이 이전 버전의 바로 가기로 간단한 bash 스크립트 (create-react-app.sh)를 만들고 bash 변수 "$ @"를 사용하여 모든 인수를 전달했습니다.

#!/bin/bash
{full-directory-path}/node_modules/create-react-app/index.js "$@"

마지막으로이 간단한 bash 스크립트를 실행 가능하게 만들었습니다.

chmod u+x create-react-app.sh

따라서이 bash 스크립트를 직접 실행하면 이전 버전의 create-react-app이 실행됩니다.

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