pnpm能替代npm link // yarn link吗?

10

npm link和yarn link都不是最好的选择。我经常在使用它们时遇到问题。现在我了解了pnpm及其本地存储功能。我想知道在以下情况下,pnpm是否能够帮助我解决npm link问题:

我有两个项目,分别位于不同的仓库中,因此不在一个工作空间中。其中一个是“应用程序”,另一个是“库”,被应用程序使用。现在,我想以某种方式构建该库,并在应用程序中使用新构建的库,而不必将其发布到全局npm注册表中。这正是我经常使用yarn link的原因。但是,我想知道是否可以通过pnpm向“本地存储”中“发布”文件。

所以我的问题是:是否可以以这样的方式将构建后的包发布到本地pnpm存储库中,以便在“应用程序”中运行“pnpm install lib”成功安装新构建的“lib”包?


“发布到本地存储”听起来就像是yalc所做的事情。 - nobody
2个回答

12

有三种方法。

您可以使用文件协议引用本地库:

{
  "dependencies": {
    "lib": "file:../lib"
  }
}

在这种情况下,pnpm将为lib的每个文件创建硬链接。看起来就像是将lib复制到了你的应用程序的node_modules目录中。
您可以使用链接协议:
{
  "dependencies": {
    "lib": "link:../lib"
  }
}

在这种情况下,pnpm 会创建一个符号链接到你的 lib 在 app/node_modules/lib 中。
或者你可以使用 pnpm pack 将你的 lib 打包成 tarball,并通过文件协议进行安装。
{
  "dependencies": {
    "lib": "file:../lib/lib-1.0.0.tgz"
  }
}

没有办法“发布到本地存储”。


那么必须直接编辑package.json吗?不过这样对于git来说不太好吧? - Bernardo Dal Corno
1
我猜你在推送更改之前仍需要使用未链接的软件包进行测试。因此,在提交之前,这将是一个额外的提醒,要撤销你的更改。 - Zoltan Kochan
1
2023年有其他方法吗? pnpm link不会覆盖package.json中定义的那个。它仍然尝试安装JSON文件中的那个。而且,当我尝试使用link协议时似乎无法禁用后安装操作。 - Aivan Monceller

2
在这个背景下:
/home/projects/myapp:myapp的本地git仓库,其中包含依赖项"mylib": "https://mygitlab.tld/team/mylib.git" /home/projects/mylib:mylib的本地git仓库
我想在myapp中进行本地实时测试开发mylib,而不更改myapp的package.json依赖项。
为了实现这一点,在/home/projects/myapp中运行pnpm link ../mylib => /home/projects/myapp/node_modules/mylib现在是一个符号链接到/home/projects/mylib(而不是/home/projects/myapp/node_modules/.pnpm/mygitlab.tld+team+mylib...),因此在/home/projects/mylib中的每次更改上,/home/projects/myapp中启动的pnpm start都可以正常工作。
即使mylib的名称不是mylib,如果它在其package.json中的名称是@myteam/lib,那么pnpm link ../mylib将会将/home/projects/myapp/node_modules/@myteam/lib链接到/home/projects/mylib。
为了达到相同的结果,你也可以将链接设置为全局的(在本地的pnpm存储中注册你的本地副本,然后使用它)。
  • /home/projects/mylib目录下运行pnpm link --global
  • /home/projects/myapp目录下运行pnpm link --global mylib(如果mylib的名称是@myteam/lib,则应该是pnpm link --global @myteam/lib
如果mylib在多个地方使用,并且你想快速切换到另一个mylib git工作树,使用这种方式可能更容易(只需在要使用的mylib目录中运行pnpm link --global,而无需重新链接所有使用它的地方)。

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