重命名已发布的 NPM 模块

123

有没有办法重命名已经发布的NPM模块? 我想将我的模块名称更改为更准确地匹配其公开的API,但不想让已经安装它的人陷入困境。


我们是否可以通过发布一个带有 post install 脚本的新主要版本来替换 package.json 中的包名称并重新运行安装呢? - Tofandel
8个回答

148
没有专门的方法来做到这一点。一个常见的技巧是使用npm-deprecate来发出警告,指示新的软件包名称。
npm deprecate my-project-name@"<= latest-version" "This project has been renamed. Install using new-project-name instead."

例子:

npm deprecate my-thing@"<= 0.2.3" "This project has been renamed. Install using my-new-thing instead."

npm-deprecate文档


30

简单来说,不能直接删除一个 npm 包,但是 npm 提供了一种名为 npm deprecate 的不同解决方案。

它的作用是将某个特定版本或版本范围的包标记为已弃用。因此,下次有人尝试安装这个包时,他们会收到“包已弃用”的警告信息,以及您可以轻松指定新的包名称的自定义消息。

使用方法:

npm deprecate my-package-name@"< latest-version" "your message"

您的信息可以是任何内容,例如:

WARNING: This project has been renamed to your-new-package-name. Install using new-package-name instead.

4
最好使用<=而不是<,这样它也会通知最新版本? - David Sherret

20
如果软件包发布时间少于24小时:
npm unpublish <wrong package name> --force

3
是的,如果包刚刚发布(不到24小时),这个方法可以使用。 - Moso Akinyemi

18

从文档中得知:

注册表数据是不可变的,这意味着一旦发布了包,就无法更改。我们出于安全和依赖于这些软件包的用户的稳定性原因采取这种措施。

然而,在72小时内新发布的软件包可以通过运行以下命令取消发布:

npm unpublish <package_name> -f

如果包是在72小时内发布的,这将从NPM注册表中删除该软件包。然后,您可以更改软件包的名称并再次发布。

注意:如果您尝试使用相同的名称重新发布软件包,则需要等待24小时。


17

有人为此构建了一个方便的 npm 插件,可以轻松地完成这个任务。

https://www.npmjs.com/package/@tiaanduplessis/pkg-rename

  1. 使用 npm -g install @tiaanduplessis/pkg-rename 命令安装该包。
  2. 在 package.json 文件中更改要重命名的 npm 模块的名称并保存。
  3. 运行 pkg-rename old-package-name 命令。

根据文档:

这将从 npm 获取旧软件包的最新版本,并使用消息废弃此版本及之前发布的所有版本:

WARNING: This project has been renamed to new-package-name. Install using new-package-name instead.
你也可以添加--publish标志,将新的软件包名称作为同一操作的一部分发布。
pkg-rename old-package-name --publish

记得先在 package.json 中重命名包名然后运行pkg-rename 命令。


3
npm 应该有一个新的口号:将节省 JavaScript 开发人员的时间作为一项服务 - r3wt
1
请注意,如果您在npm上启用了2FA,则pkg-rename无法正常工作。 - Shazron
为什么要用三步安装第三方包,当你可以使用官方工具在三步内完成同样的事情呢? - Clashsoft

3

我曾经也遇到过这种情况。我发布了一个名为bowser-or-node而不是browser-or-node的包。

没有办法重新命名一个包,你必须废弃并发布一个新的包。

尽管还有一种选择。如果你刚刚发布了你的包(距离发布时间少于24小时),并且你确定可以删除该包并以正确的名称发布一个新的包,那么你可以继续操作。但是,一旦发布24小时后,NPM将不允许你删除该包。

幸运的是,在不到20分钟的时间里,我发现我用错误的名称发布了包。所以我只是删除了它,并使用一个新名称再次发布了。


有趣,我正在尝试这样做,但是我被告知“包名称与现有包太相似” - 即使我刚刚删除了旧的。 - Steve Bennett
哦,实际上在我的情况下,相似之处是另一个软件包,而不是我的旧软件包。 - Steve Bennett

0

Npm撤销发布政策

只是补充一下其他用户提出的解决方案:

npm unpublish your-package-name -f
// then you can re-publish with a new name

只要满足以下条件,72小时后也可以生效:

  1. 没有其他npm公共注册表中的软件包依赖于它
  2. 过去一周下载量少于300次
  3. 有一个单一的所有者/维护者

来源:https://docs.npmjs.com/policies/unpublish

对不起,我将此作为答案而不是评论发布,因为我还没有足够的声望点来发表评论。


-3

有件了不起的事情发生在我身上:我成功地重命名了一个包。它原本被称为stdout-renderer,但我更改了每个可能出现的名称,并在废弃原始名称后重新发布,然后它以新名称(cli-artist)出现在更新的列表中未被废弃。我不确定要更改哪个字段,但我想它应该在package.json中,因为在我的情况下,那是唯一与大小写匹配的字段。

希望这有所帮助!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接