如何使用具有不同/自定义模块名称的 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 月正式推出的。我发布了我的答案以帮助遇到同样问题的其他人 如果您已经安装了该软件包,只需将其更改为:"<alias_name>": "npm:<original_package_name>@<version>",
嗨@ShivamTiwari,在package.json
。找到原来的。它看起来像:<original_package_name>:<version>
【参考方案3】:
在 npm-github 存储库中提交了一个请求该功能的问题。
在此处阅读:https://github.com/npm/npm/issues/2943
【讨论】:
我认为他们没有从一开始就提供这个是一个很大的遗憾。我经常分叉一个包来修复一个错误,然后我必须构建它并在@myusername/packagename
下发布它。我希望将@myusername/packagename
安装为packagename
很容易,这样我就可以得到我的错误修复,而无需更改任何require
或import
语句。
@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 安装软件包的主要内容,如果未能解决你的问题,请参考以下文章