cách cài đặt nhiều phiên bản gói bằng npm


100

Do https://github.com/npm/npm/issues/2943 , npm sẽ không bao giờ hỗ trợ khả năng gói bí danh và cài đặt nhiều phiên bản của cùng một gói.

Các cách giải quyết được đăng trên vấn đề github có thể hoạt động đối với các mô-đun pure-JS, nhưng khi npm trở thành tiêu chuẩn để quản lý gói frontend, các gói hiện bao gồm nhiều nội dung khác nhau như CSS.

Có giải pháp nào để cài đặt nhiều phiên bản của cùng một gói không?

Ý tưởng tốt nhất mà tôi nghĩ ra là "sao chép" một gói và xuất bản nó với một cái tên hơi khác.

Ví dụ, nếu bạn cần nhiều phiên bản của jquerybạn có thể chỉ xuất bản gói gọi jquery-alias1, jquery-alias2, jquery-alias3vv, và sau đó thiết lập các phiên bản thích hợp trong của bạn package.json.

Hoặc bạn có thể đặt tên cho gói theo số phiên bản của họ, ví dụ như jquery-1.11.x, jquery-2.1.x, vv ..

Cả hai cách tiếp cận này đều có vẻ cẩu thả. Có những cái tốt hơn?


Bower không phải là tiêu chuẩn trong quản lý gói frontend có thể dễ dàng thực hiện điều này .
laggingreflex

Có bower có vẻ như là một sự thay thế ở đây. Thật tệ là dường như không có giải pháp npm, vì việc giới thiệu một hệ thống quản lý gói khác cho một nhóm lớn có thể khó khăn. Đặc biệt nếu bạn đã thiết lập cơ sở hạ tầng để hỗ trợ npm (ví dụ: máy chủ đăng ký npm riêng tư)
đánh dấu

Câu trả lời:


103

Kể từ npm v6.9.0, npm hiện hỗ trợ bí danh gói. Nó thực hiện cú pháp giống như Yarn sử dụng:

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

Điều này bổ sung những điều sau vào package.json:

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

Cũng có thể cài đặt trực tiếp từ GitHub với cú pháp này. Ví dụ: nếu bạn muốn cài đặt cả phiên bản đăng ký npm và một nhánh GitHub của gói foobar:

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

1
sợi cũng hỗ trợ gói răng cưa
Greg K

Chào bạn, mình đã thử bước này để cài đặt 2 gói là: "react-native-track-player": "1.1.4" và "react-native-track-player": "1.1.8". Nó hoạt động tốt trên iOS, nhưng trên Android, nó hiển thị lỗi "MusicManager $ 1 được xác định nhiều lần". Làm cách nào để ngăn Android xây dựng 1.1.8?
EmBeCoRau

Do một số xung đột trong Thư viện, tôi cần sử dụng 1.1.8 trên iOS và 1.1.4 trên Android
EmBeCoRau

Không phù hợp với tôi vì bí danh của người phụ thuộc khác với những gì nó đang tìm kiếm, tức là nó đang tìm kiếm eslint, nhưng không biết nó hiện đã được đặt têneslint6
Crimbo

75

Tôi muốn đăng ở đây cho bất kỳ ai giống như tôi đang sử dụng Yarn và đã hạ cánh ở đây. Nó là một sự thay thế ít nhiều cho NPM hỗ trợ răng cưa ngoài hộp:

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

(ví dụ: tín dụng chuyển đến https://github.com/callemall/material-ui/issues/7195#issuecomment-314547601 )


17
Cảm ơn bạn. Chỉ cần làm rõ rằng công thức chung là <alternative-name>@npm:<package-name>@<version>
NikosKeyz

5

Có vẻ như "JSPM" có thể là công cụ chính xác mà bạn đang tìm kiếm. JSPM được xây dựng dựa trên NPM nhưng cho phép bạn kéo các gói từ nhiều nguồn (github, npm, v.v.). Nó sử dụng trình tải mô-đun đa năng System.js ở giao diện người dùng để tải mô-đun và "sử dụng quản lý phiên bản phẳng để tải xuống các thư mục có hậu tố phiên bản" rất dễ lý giải.

jspm.io

Khi bạn cài đặt một gói với jspm, bạn có thể đặt bí danh cho gói đó thành một tên cụ thể, sau này bạn có thể đặt tên riêng cho gói đó requiretrong các mô-đun của mình.

$ 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

Sau đó, trong js của bạn, bạn có thể đơn giản require(jquery)và / hoặc require(jqueryOne)khi cần thiết, cho phép bạn qua lại khi cần thiết.

Điều này cũng xảy ra tương tự đối với bất kỳ gói nào bạn muốn sử dụng nhiều phiên bản.


2

Điều này khá khó thực hiện một cách rõ ràng, do cách hoạt động của npm, vì vậy tôi sẽ tránh cố gắng thực hiện nó trong quá trình sản xuất.

Tuy nhiên, để kiểm tra tích hợp và các trường hợp sử dụng tương tự, tôi đã tạo một gói có tên multidep , cho phép bạn cài đặt nhiều phiên bản của cùng một gói và requirechúng như vậy:

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

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

0

Phiên bản cài đặt NPM ( https://github.com/scott113341/npm-install-version ) cũng là một tùy chọn. Về cơ bản, nó thực hiện những gì một số giải pháp khác ở đây làm (nói về mặt kỹ thuật) nhưng khá dễ sử dụng. Các mô-đun được cài đặt với số phiên bản (tham số lệnh @version tiêu chuẩn được NPM sử dụng) được cài đặt dự đoán trong một thư mục con dưới node_modules với tên đó. Bạn cũng có thể kiểm soát dir đích trên mỗi mô-đun - điều này rất hữu ích với các hệ thống xây dựng.

Đoạn mã sử dụng từ Tài liệu 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 ) là một tùy chọn khác. Nó có thể được sử dụng trên dòng lệnh hoặc thông qua giao diện lập trình - được viết bằng TypeScript để phát triển hiện đại.

Ví dụ # 1: Cài đặt vào thư mục được tạo phiên bản (mặc định)

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/

Ví dụ # 2: Cài đặt vào thư mục tùy chỉnh

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/

Ví dụ # 3: Cài đặt với đầu ra tiêu chuẩn im lặng hoặc ồn ào

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

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

Ví dụ # 4: Ghi đè cài đặt hiện có

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

Trong trường hợp của tôi, tôi cần cài đặt phiên bản create-react-app cũ hơn phiên bản tôi đã cài đặt trên toàn cầu vì tôi đang tham gia một khóa học yêu cầu phiên bản cũ hơn này cho các bài tập.

Tôi đã tạo một thư mục mới chỉ để chứa phiên bản cũ hơn này, cd'd vào nó và đã thực hiện

npm init

Sau khi thiết lập shell package.json này, tôi đã cài đặt phiên bản chính xác của create-react-app mà tôi cần

npm install create-react-app@1.5.2

đã tạo một thư mục node_modules cục bộ với phiên bản cũ hơn của create-react-app.

Sau đó, tôi tạo một tập lệnh bash đơn giản (create-react-app.sh) làm lối tắt cho phiên bản cũ hơn này và sử dụng biến bash "$ @" để chuyển tiếp tất cả các đối số:

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

Cuối cùng, tôi đã thực thi tập lệnh bash đơn giản này

chmod u+x create-react-app.sh

Vì vậy, việc chạy trực tiếp tập lệnh bash này sẽ thực thi phiên bản cũ hơn của create-react-app:

./create-react-app.sh  --version
1.5.2
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.