npm kullanarak birden çok paket sürümü nasıl kurulur


102

Https://github.com/npm/npm/issues/2943 nedeniyle , npm, paketleri takma ve aynı paketin birden çok sürümünü yükleme özelliğini hiçbir zaman desteklemeyecektir.

Github sorunu üzerine yayınlanan geçici çözümler saf JS modülleri için işe yarayabilir, ancak npm ön uç paket yönetimi için bir standart haline geldiğinden, paketler artık CSS gibi çeşitli varlıkları içerir.

Aynı paketin birden çok sürümünü yüklemek için herhangi bir geçici çözüm var mı?

Bulduğum en iyi fikir, bir paketi "klonlamak" ve onu biraz farklı bir adla yayınlamaktır.

Eğer birden çok sürümü gerekiyorsa Örneğin, jquerySadece telefon paketleri yayınlamak olabilir jquery-alias1, jquery-alias2, jquery-alias3vb ve ardından uygun sürümleri set package.json.

Yoksa onların sürüm numarası, örneğin göre paketleri sayabilirim jquery-1.11.x, jquery-2.1.xvb ..

Bu yaklaşımların her ikisi de özensiz görünüyor. Daha iyileri var mı?


Bunu kolayca yapabilen ön uç paket yönetiminde standardı güçlendirmez .
gecikme refleksi

Yes bower burada bir alternatif gibi görünüyor. Büyük bir ekibe başka bir paket yönetim sistemini tanıtmak zor olabileceğinden, bir npm çözümünün olmaması çok kötü. Özellikle npm'yi (ör. Özel bir npm kayıt sunucusu) desteklemek için önceden ayarlanmış bir altyapınız varsa
işaretleyin

Yanıtlar:


106

İtibariyle npm v6.9.0, npm şimdi paket takma adlarını destekler. Bu aynı sözdizimini uygulayan İplik kullanımlar olarak:

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

Bu, aşağıdakileri ekler package.json:

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

Bu sözdizimi ile doğrudan GitHub'dan kurmak da mümkündür. Örneğin, hem npm kayıt defteri sürümünü hem de paketin GitHub çatalını yüklemek istiyorsanız foobar:

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

1
iplik aynı zamanda paket örtüşmesini de destekler
Greg K

Merhaba, 2 paketi yüklemek için şu adımı denedim: "react-native-track-player": "1.1.4" ve "react-native-track-player": "1.1.8". İOS'ta iyi çalışıyor, ancak Android'de "MusicManager $ 1 birden çok kez tanımlandı" hatası gösteriyor. Android'in 1.1.8'i oluşturmasını nasıl engelleyebilirim?
EmBeCoRau

Kitaplıkta bir miktar çakışma olduğu için, iOS'ta
1.1.8'i

Bağımlılığın takma adı aradığından farklı olduğu için işe yaramadı, yani aradığı eslint, ancak şimdi adlandırıldığını bilmiyordueslint6
Crimbo

75

Benim gibi İplik kullanan ve buraya inen herkes için buraya yazı yazmak istedim . Kutudan çıkan takma adlamayı destekleyen NPM için aşağı yukarı açılan bir alternatiftir:

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

(kredi, örneğin https://github.com/callemall/material-ui/issues/7195#issuecomment-314547601 adresine gider )


17
Teşekkür ederim. Sırf genel formülün açıklığa kavuşturmak için <alternative-name>@npm:<package-name>@<version>
NikosKeyz

5

Görünüşe göre "JSPM" tam olarak aradığınız araç olabilir. JSPM, NPM'nin üzerine kurulur, ancak paketleri birden çok kaynaktan (github, npm, vb.) Çekmenize izin verir. Modülleri yüklemek için ön uçtaki System.js evrensel modül yükleyicisini kullanır ve hakkında akıl yürütmesi kolay olan "sürüm son ekli klasörlere indirmek için düz sürüm yönetimini kullanır".

jspm.io

Jspm ile bir paket kurduğunuzda, bu paketi daha sonra requireözellikle modüllerinizde kullanabileceğiniz belirli bir adla değiştirebilirsiniz .

$ 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

Ardından js'nizde basitçe require(jquery)ve / veya require(jqueryOne)gerektiği gibi yapabilirsiniz , gerektiğinde ileri geri gitmenize izin verirsiniz.

Bu, birden çok sürümünü kullanmak istediğiniz herhangi bir paket için aynıdır.


2

Bunu temiz bir şekilde yapmak, npm'nin çalışma şeklinden dolayı oldukça zordur, bu yüzden bunu üretimde yapmaya çalışmaktan kaçınırım.

Ancak, entegrasyon testi ve benzer kullanım durumları için, aynı paketin birden çok sürümünü kurmanıza olanak tanıyan multidep adlı bir paket oluşturdum ve requirebunlar şöyle:

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

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

0

NPM Yükleme Sürümü ( https://github.com/scott113341/npm-install-version ) da bir seçenektir. Esasen buradaki diğer çözümlerden bazılarının yaptığını yapar (teknik olarak konuşursak), ancak kullanımı oldukça basittir. Bir sürüm numarasıyla (NPM tarafından kullanılan standart @version komut parametresi) kurulan modüller, tahmin edilebileceği gibi bu ada sahip node_modules altındaki bir alt klasöre yüklenir . Ayrıca modül başına hedef dizini de kontrol edebilirsiniz - bu, yapı sistemlerinde kullanışlıdır.

GitHub Dokümanlarından kullanım kodu pasajı:

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 ) yine başka bir seçenektir. Komut satırında veya modern geliştirme için TypeScript ile yazılmış programlı bir arabirim aracılığıyla kullanılabilir.

Örnek 1: Sürümü belirlenmiş (varsayılan) dizine yükleme

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/

Örnek 2: Özel dizine yükleme

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/

Örnek 3: Sessiz veya gürültülü standart çıktıyla kurulum

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

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

Örnek 4: Mevcut bir kurulumun üzerine yazın

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

Benim durumumda, global olarak yüklediğim sürümden daha eski bir create-react-app sürümünü yüklemem gerekiyordu, çünkü ödevler için bu eski sürümü gerektiren bir kursa gidiyordum.

Sadece bu eski sürümü içermek için yeni bir klasör oluşturdum, içine cd ekledim ve

npm init

Bu shell package.json'u kurduktan sonra, ihtiyacım olan create-react-app'in tam sürümünü kurdum

npm install create-react-app@1.5.2

Bu, create-react-app'in eski sürümüyle yerel bir node_modules klasörü oluşturdu.

Daha sonra, bu eski sürüme kısayol olarak basit bir bash betiği (create-react-app.sh) oluşturdum ve tüm argümanları iletmek için "$ @" bash değişkenini kullandım:

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

Son olarak, bu basit bash betiğini çalıştırılabilir hale getirdim

chmod u+x create-react-app.sh

Bu bash betiğini doğrudan çalıştırmak, create-react-app'in eski sürümünü çalıştıracaktır:

./create-react-app.sh  --version
1.5.2
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.