如何使用具有不同/自定义模块名称的 npm 安装软件包

Posted

技术标签:

【中文标题】如何使用具有不同/自定义模块名称的 npm 安装软件包【英文标题】:How do I install a package with npm with a different/custom module name 【发布时间】:2013-06-12 04:46:23 【问题描述】:

我想从一个名为“mymodule”的 github tarball 安装一个特定的修订版,并将其命名为“mymoduleTemp”,然后加载一个可能不同的版本,该版本将采用真实名称“mymodule”。

那么,我该怎么做第一件事呢?我正在寻找类似的东西:

npm install https://github.com/me/mymodule/tarball/someTag -name mymoduleTemp

有没有办法做到这一点?锦上添花:

如果 mymodule 已经存在,则在安装 mymoduleTemp 时它不会被破坏(即理想情况下,该过程不会安装为 mymodule 然后重命名文件夹)

【问题讨论】:

【参考方案1】:

由于npm@6.9.0,您可以在自定义模块名称下安装包。 npm@6.9.0 introduces support 用于包别名。

要在自定义模块名称下安装 tarball,请使用 custom-name@tarball-url 参数,例如将特定的express tarball 安装为my-express 模块:

npm i my-express@https://github.com/expressjs/express/archive/4.16.3.tar.gz

此功能还允许为发布到 npm 注册表的包添加别名:

npm i express@npm:@my-scope/express

【讨论】:

看起来 yarn 有这个功能已经有一段时间了。这些天我还是用纱线。谢谢! 语法的上游文档在哪里?在发行说明中找到了有关此功能的信息,但在此答案之前我无法弄清楚如何使用它。 @Epeli 我没有在文档中找到任何关于包别名的提及。我从功能拉取请求中添加的测试用例中学习了如何使用它。 @PavelZubkou - 我假设你的意思 > 将特定的 express tarball 安装为 myexp 模块:而不是这个:> 将特定的 express tarball 安装为 my-express 模块:【参考方案2】:

在较新版本的 npm (6+) 中,现在可以使用别名来命名模块名称

npm i <alias_name>@npm:<original_package_name>

【讨论】:

“新”是什么意思? @roydukkey 你需要 npm 6+ 来完成这个技巧。这个问题是在 2013 年发布的,而 npm6 是在 2018 年 4 月正式推出的。我发布了我的答案以帮助遇到同样问题的其他人 如果您已经安装了该软件包,只需将其更改为:"&lt;alias_name&gt;": "npm:&lt;original_package_name&gt;@&lt;version&gt;", 嗨@ShivamTiwari,在package.json。找到原来的。它看起来像:&lt;original_package_name&gt;:&lt;version&gt;【参考方案3】:

在 npm-github 存储库中提交了一个请求该功能的问题。

在此处阅读:https://github.com/npm/npm/issues/2943

【讨论】:

我认为他们没有从一开始就提供这个是一个很大的遗憾。我经常分叉一个包来修复一个错误,然后我必须构建它并在@myusername/packagename 下发布它。我希望将@myusername/packagename 安装为packagename 很容易,这样我就可以得到我的错误修复,而无需更改任何requireimport 语句。 @BT 是的,我认为 Isaac Schleuter 在做出 Guido van Rossumesqe 决定时并不是很有远见。 @Andy 你已经可以通过指定URL as dependency来做到这一点。 @riezebosch 仍然很遗憾,您无法分叉 somepackage,修复某些内容,将其发布到 npm 为 @myusername/somepackage,然后将其安装为 somepackage... 它会改为安装为@myusername/somepackage。但我猜想运行 npm pack,将 tarball 复制到任何服务器,然后从该 URL 安装也不错。 @Andy 您的案例现在已包含在npm@6.9.0 中,试试npm i somepackage@npm:@myusername/somepackage【参考方案4】:

你可以这样做:

    获取压缩包并解压 将其package.json 中的name 更改为@me/mymoduleTemp(您可以通过使用vim mymoduleTemp.tgz 编辑tarball 来跳过步骤1 和3) 压缩成mymoduleTemp.tgz 运行npm publish mymoduleTemp.tgz(使用--access public,除非您希望对其进行限制) 在您的主项目中,运行npm install @me/mymoduleTemp

我建议将其发布为 scoped package,因为如果您将其发布为无范围的 mymoduleTemp,那么其他人就无法使用该名称。

如果您认为即使发布作用域包也会污染 npm 注册表,那么您可以将新的 tarball 放在您自己的私有服务器(或 GitHub 或任何地方)上,然后通过 URL 安装它。

【讨论】:

嗯,感谢您提供的解决方法,但以另一个名称发布内容不是我想做的事情,对于任何想要在 npm 上发布欺骗的人来说,它也无法扩展。 如果它在你自己的范围内,谁在乎? @BT 我添加了一条关于在任何情况下都将 tarball 托管在 npm 注册表之外的注释。【参考方案5】:

对于浏览器,您可以在package.json 中添加别名

https://github.com/defunctzombie/package-browser-field-spec

例如:


  ....
  "browser": 
    "someTag": "mymoduleTemp"
  

这也适用于带有metro 捆绑器的“react-native”。 我从来没有用 webpack 包测试过。

【讨论】:

以上是关于如何使用具有不同/自定义模块名称的 npm 安装软件包的主要内容,如果未能解决你的问题,请参考以下文章

解决 2 个 npm 模块具有相同名称的组件时的名称冲突

如何发布一个自定义Node.js模块到NPM(详细步骤)

如何使用来自不同模块的两个具有相同名称的 AngularJS 服务?

python查漏补缺 --- 模块及异常

延迟加载具有相同名称的不同库

Django 1.7 - 具有自定义应用标签的模型发现和应用配置