【问题标题】:how to install multiple versions of package using npm如何使用 npm 安装多个版本的包
【发布时间】:2014-12-12 10:06:42
【问题描述】:

由于https://github.com/npm/npm/issues/2943,npm 将永远不会支持为包命名和安装同一包的多个版本的能力。

在 github 问题上发布的解决方法可能适用于纯 JS 模块,但随着 npm 成为前端包管理的标准,包现在包含各种资产,例如 CSS。

是否有任何解决方法可以安装同一软件包的多个版本?

我想出的最好办法是“克隆”一个包,然后用稍微不同的名称发布它。

例如,如果您需要多个版本的jquery,您可以只发布名为jquery-alias1jquery-alias2jquery-alias3 等的包,然后在您的package.json 中设置适当的版本。

或者你可以根据包的版本号来命名包,例如jquery-1.11.xjquery-2.1.x等。

不过,这两种方法似乎都很草率。有更好的吗?

【问题讨论】:

  • 在前端包管理中的标准不是 bower 可以easily do this
  • 是的,凉亭在这里似乎是一个替代方案。太糟糕了,似乎没有 npm 解决方案,因为向大型团队引入另一个包管理系统可能很困难。特别是如果您已经设置了支持 npm 的基础架构(例如,私有 npm 注册表服务器)

标签: npm packages frontend


【解决方案1】:

截至npm v6.9.0, npm 现在支持包别名。它implements the same syntax Yarn 使用:

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 注册表版本和包 foobar 的 GitHub 分支:

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

【讨论】:

  • yarn also supports 包别名
  • 嗨,我已经尝试了这些步骤来安装 2 个软件包:“react-native-track-player”:“1.1.4”和“react-native-track-player”:“1.1 .8"。它在 iOS 上运行良好,但在 Android 上显示错误“MusicManager$1 已定义多次”。如何防止 Android 构建 1.1.8 ?
  • 由于Library有些冲突,我需要在iOS上使用1.1.8,在Android上使用1.1.4
  • 对我不起作用,因为依赖的别名与它正在寻找的不同,即它正在寻找eslint,但不知道它现在被命名为eslint6跨度>
  • 谢谢!它帮助我安装了相同软件包的 2 个实例。我需要这个,因为这个模块(paypal-rest-sdk)使用全局对象作为参数,但我需要在同一个应用程序中集成不同的贝宝。
【解决方案2】:

我想在这里为像我这样使用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

【讨论】:

  • 谢谢。只是为了澄清通用公式是<alternative-name>@npm:<package-name>@<version>
  • 太棒了。我试图安装yarn add react-bootstrap4@npm:react-bootstrap@1.5.1,但反应webpacker 抱怨它找不到模块react-bootstrap4。但是,yarn add react-bootstrap-next@npm:react-bootstrap@1.5.1 具有魅力
【解决方案3】:

听起来“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),让你可以根据需要来回切换。

这对于您想使用多个版本的任何软件包都是一样的。

【讨论】:

    【解决方案4】:

    由于 npm 的工作方式,这很难干净地完成,所以我会避免在生产环境中尝试这样做。

    但是,对于集成测试和类似用例,我创建了一个名为 multidep 的包,它允许您安装同一个包的多个版本,require 它们如下所示:

    var multidepPackages = require('multidep')('test/multidep.json');
    
    var jquery1 = multidepRequire('jquery', '1.11.3');
    var jquery2 = multidepRequire('jquery', '2.1.4');
    

    【讨论】:

      【解决方案5】:

      在我的情况下,我需要安装比我已经安装的版本更新的 react-table 版本 7,即全局的 react-table 版本 6。所以我们面临新开发的问题,我们需要使用新版本的表而不破坏应用程序中的旧表功能,所以我用不同的键安装了两个表-

      例如

      1. npm install react-table-7@npm:react-table@latest - 新
      2. npm install react-table@npm:react-table@6.11.5 - 旧

      【讨论】:

        【解决方案6】:

        就我而言,我需要安装比我在全局安装的版本更旧的 create-react-app 版本,因为我正在学习的课程需要这个旧版本来完成作业。

        我创建了一个新文件夹只是为了包含这个旧版本,cd 进去,然后做了一个

        npm init
        

        设置完这个 shell 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
        

        【讨论】:

          【解决方案7】:

          NPM 安装版本 (https://github.com/scott113341/npm-install-version) 也是一个选项。它基本上做了这里的一些其他解决方案所做的事情(从技术上讲),但使用起来非常简单。使用版本号(NPM 使用的标准 @version 命令参数)安装的模块可以预见地安装在具有该名称的 node_modules 下的子文件夹中。您还可以控制每个模块的目标目录 - 这对于构建系统很有用。

          GitHub Docs 中的使用代码 sn-p:

          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
          

          【讨论】:

            【解决方案8】:

            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
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2011-09-28
              • 1970-01-01
              • 2017-10-04
              • 2022-08-18
              • 2019-04-23
              • 2013-03-31
              • 1970-01-01
              相关资源
              最近更新 更多