cara menginstal beberapa versi paket menggunakan npm

107

Karena https://github.com/npm/npm/issues/2943 , npm tidak akan pernah mendukung kemampuan untuk membuat alias paket dan menginstal beberapa versi dari paket yang sama.

Solusi yang diposting pada masalah github mungkin berfungsi untuk modul pure-JS, tetapi karena npm menjadi standar untuk manajemen paket frontend, paket sekarang menyertakan berbagai aset seperti CSS.

Apakah ada solusi untuk menginstal beberapa versi dari paket yang sama?

Ide terbaik yang saya dapatkan adalah "mengkloning" sebuah paket, dan menerbitkannya dengan nama yang sedikit berbeda.

Misalnya, jika Anda membutuhkan beberapa versi jquery, Anda hanya bisa mempublikasikan paket disebut jquery-alias1, jquery-alias2, jquery-alias3dll, dan kemudian mengatur versi yang tepat dalam Andapackage.json .

Atau Anda bisa nama paket sesuai dengan nomor versi mereka, misalnya jquery-1.11.x, jquery-2.1.x, dll ..

Kedua pendekatan ini tampak ceroboh. Apakah ada yang lebih baik?

menandai
sumber
Tidak mendukung standar dalam manajemen paket frontend yang dapat dengan mudah melakukan ini .
laggingreflex
Ya bower sepertinya alternatif di sini. Sayang sekali sepertinya tidak ada solusi npm, karena memperkenalkan sistem manajemen paket lain ke tim besar bisa jadi sulit. Terutama jika Anda sudah menyiapkan infrastruktur untuk mendukung npm (mis. Server registri npm pribadi)
tandai

Jawaban:

115

Mulai npm v6.9.0, npm sekarang mendukung alias paket. Ini mengimplementasikan sintaks yang sama seperti yang digunakan Yarn:

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

Ini menambahkan yang berikut ke package.json:

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

Dimungkinkan juga untuk menginstal langsung dari GitHub dengan sintaks ini. Misalnya, jika Anda ingin menginstal versi registri npm dan garpu GitHub dari paket tersebut foobar:

npm install foobar
npm install foobar-fork@github:username/foobar
Rens Baardman
sumber
1
benang juga mendukung paket aliasing
Greg K
Hai, Saya sudah mencoba langkah ini untuk menginstal 2 paket yaitu: "react-native-track-player": "1.1.4" dan "react-native-track-player": "1.1.8". Ini berfungsi dengan baik di iOS, tetapi di Android itu menunjukkan kesalahan bahwa "MusicManager $ 1 ditentukan beberapa kali". Bagaimana cara mencegah Android membangun 1.1.8?
EmBeCoRau
Karena beberapa konflik di Library, saya perlu menggunakan 1.1.8 di iOS dan 1.1.4 di Android
EmBeCoRau
Tidak berhasil untuk saya karena alias ketergantungannya berbeda dengan yang dicarinya, yaitu yang dicarinya eslint, tetapi tidak tahu sekarang namanyaeslint6
Crimbo
77

Saya ingin memposting di sini untuk siapa saja seperti saya yang menggunakan Benang dan mendarat di sini. Ini adalah pengganti drop-in untuk NPM yang mendukung aliasing out of the box:

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

(kredit misalnya pergi ke https://github.com/callemall/material-ui/issues/7195#issuecomment-314547601 )

tmahle
sumber
18
Terima kasih. Hanya untuk memperjelas bahwa rumus umum adalah <alternative-name>@npm:<package-name>@<version>
NikosKeyz
5

Sepertinya "JSPM" adalah alat yang Anda cari. JSPM dibangun di atas NPM tetapi memungkinkan Anda untuk menarik paket dari berbagai sumber (github, npm, dll). Ia menggunakan pemuat modul universal System.js di bagian depan untuk memuat modul, dan "menggunakan manajemen versi datar untuk mengunduh ke dalam folder dengan akhiran versi" yang mudah dipikirkan.

jspm.io

Ketika Anda menginstal sebuah paket dengan jspm Anda dapat membuat alias paket itu dengan nama tertentu, yang nantinya dapat Anda requiresecara khusus di modul Anda.

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

$ jspm install [email protected]
... (status msgs) ...
ok   Installed jqueryOne as github:components/[email protected] (1.11.3)

      github:components/jquery 1.11.3 2.1.4

Kemudian di js Anda, Anda dapat dengan sederhana require(jquery)dan / atau require(jqueryOne)seperlunya, memungkinkan Anda untuk bolak-balik seperlunya.

Ini berlaku sama untuk paket apa pun yang ingin Anda gunakan beberapa versinya.

JemBijoux
sumber
2

Ini cukup sulit untuk dilakukan dengan bersih, karena cara kerja npm, jadi saya akan menghindari untuk melakukannya dalam produksi.

Namun, untuk pengujian integrasi dan kasus penggunaan serupa, saya membuat paket yang disebut multidep , yang memungkinkan Anda menginstal beberapa versi dari paket yang sama dan requireseperti itu:

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

var jquery1 = multidepRequire('jquery', '1.11.3');
var jquery2 = multidepRequire('jquery', '2.1.4');
Jo Liss
sumber
0

Versi Instal NPM ( https://github.com/scott113341/npm-install-version ) juga merupakan opsi. Ini pada dasarnya melakukan apa yang dilakukan beberapa solusi lain di sini (secara teknis) tetapi cukup mudah digunakan. Modul yang diinstal dengan nomor versi (parameter perintah @version standar yang digunakan oleh NPM) dapat diprediksi diinstal dalam sub-folder di bawah node_modules dengan nama itu. Anda juga dapat mengontrol dir tujuan per modul - yang berguna dengan sistem build.

Potongan kode penggunaan dari Dokumen GitHub:

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

niv.install('[email protected]');
// installs [email protected] to node_modules/[email protected]/

niv.install('[email protected]');
// installs [email protected] to node_modules/[email protected]/

const csjs_old = niv.require('[email protected]');
const csjs_new = niv.require('[email protected]');
// 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
SylonZero
sumber
0

install-npm-version( https://github.com/scott-lin/install-npm-version ) adalah opsi lain. Ini dapat digunakan pada baris perintah, atau melalui antarmuka program - ditulis dalam TypeScript untuk pengembangan modern.

Contoh # 1: Instal ke direktori berversi (default)

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

inv.Install('[email protected]');
// installs [email protected] to node_modules/[email protected]/

inv.Install('[email protected]');
// installs [email protected] to node_modules/[email protected]/

Contoh # 2: Instal ke direktori kustom

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

inv.Install('[email protected]', { 'Destination': 'some/path/chalk' });
// installs [email protected] to node_modules/some/path/chalk/

Contoh # 3: Instal dengan output standar senyap atau berisik

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

inv.Install('[email protected]', { 'Verbosity': 'Silent' });
inv.Install('[email protected]', { 'Verbosity': 'Debug' });

Contoh # 4: Menimpa instalasi yang sudah ada

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

inv.Install('[email protected]', { 'Destination': 'mydir' });
// installs [email protected] to node_modules/mydir/

inv.Install('[email protected]', { 'Destination': 'mydir' });
// does not install [email protected] since node_modules/mydir/ already exists

inv.Install('[email protected]', { 'Destination': 'mydir', 'Overwrite': true });
// installs [email protected] to node_modules/mydir/ by overwriting existing install
Scott Lin
sumber
0

Dalam kasus saya, saya perlu menginstal aplikasi create-react-app versi lama daripada versi yang telah saya instal secara global, karena saya mengambil kursus yang memerlukan versi lama ini untuk tugas.

Saya membuat folder baru hanya untuk memuat versi lama ini, memasukkannya ke dalamnya, dan melakukan

npm init

Setelah menyiapkan shell package.json ini, saya menginstal versi persis dari create-react-app yang saya butuhkan

npm install [email protected]

yang membuat folder node_modules lokal dengan versi lama dari create-react-app.

Kemudian saya membuat skrip bash sederhana (create-react-app.sh) sebagai pintasan ke versi yang lebih lama ini, dan menggunakan variabel bash "$ @" untuk meneruskan semua argumen:

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

Akhirnya, saya membuat skrip bash sederhana ini dapat dieksekusi

chmod u+x create-react-app.sh

Jadi langsung menjalankan skrip bash ini akan mengeksekusi versi lama dari create-react-app:

./create-react-app.sh  --version
1.5.2
Stefan Musarra
sumber