如何强制 Yarn 重新安装包?

How do I force Yarn to reinstall a package?

我的项目有一个依赖项,我有时从包服务器获得,有时从我机器上的本地副本获得。因此,我经常需要在寻找依赖项的地方切换 Yarn。此外,我经常更改依赖项的本地副本,并且需要看到该更改反映在我的主项目中。因此,我需要一种方法来告诉 Yarn 继续寻找依赖项的相同位置,但要重新安装依赖项,跳过缓存并直接从其当前源获取它,即使版本号没有改变。 (有时我想尝试对依赖项进行小的更改,每次更新版本号很快就会变得很烦人。)

我该怎么做?

我尝试了以下方法,但 none 有效:

yarn remove dependency
yarn add file:/dependency

继续使用以前版本的依赖项。

yarn remove dependency
yarn cache clear
yarn add file:/dependency
yarn install --force

也继续使用之前版本的依赖

yarn remove dependency
rm -rf node_modules/
yarn cache clear
yarn add file:/dependency
yarn install --force

仍然继续使用之前版本的依赖。

如何确保 Yarn 使用我的依赖项的最新版本?

可以使用yarn link command。这将设置您的本地依赖项,以便每当您对依赖项进行更改时,它会立即显示在您的主项目中,而您无需执行任何其他操作来更新它。

如果您的主项目在 ~/programming/main 中并且您的依赖项在 ~/programming/dependency 中并命名为 MyLocalDependency,您需要:

1) 运行 yarn link(没有额外的标志)来自你的依赖:

cd ~/programming/dependency
yarn link

2) 运行 yarn link <name of dependency package> 来自你的主项目:

cd ~/programming/main
yarn link MyLocalDependency

大功告成!

如果你想从依赖的本地副本切换到别处托管的副本,你可以使用 yarn unlink.

cd ~/programming/main
yarn unlink MyLocalDependency
cd ~/programming/dependency
yarn unlink

如果您使用 NPM 而不是 Yarn,npm linknpm link <dependency> 的工作方式相同。要取消 link 依赖关系,运行 npm rm --global <dependency>。 (这是因为 npm link 通过在全局 NPM 包集中创建一个 simlink 来工作,因此从全局包中卸载 linked 依赖项也会破坏 link。 )

the npm link documentation and How do I uninstall a package installed using npm link?

在删除节点模块后重新安装包适用于:

yarn install --check-files

还有一种方法。 只需使用 yarn upgrade package-name

参见手册:https://yarnpkg.com/lang/en/docs/cli/upgrade/

一样,yarn link是一个不错的选择。
但如果您链接的包具有 peer 依赖项,则可能会导致一些问题。

什么也是个办法:

yarn --check-files

但这将重新安装(yarn 没有 sub-command 与 yarn install 相同)每个已更改的包。

因此,如果您真的只想重新安装一个软件包:

yarn add package-name --force

除了这些答案,我在切换 git 分支和 yarn 时遇到问题。我有一个分支用于更新 node_modules 包,另一个分支用于我的项目错误修复。当我签出错误修复并返回更新分支时,yarn installyarn returns:

success Already up-to-date.
✨  Done in 0.79s.

但是没有安装所有新包。所以用下面的命令,我强制纱线安装所有的包:

yarn --check-files

现在 returns:

  Building fresh packages...
✨  Done in 79.91s.

虽然这不是 Yarn 的答案(它似乎确实适用于 yarn,没有 package.lock 或任何东西),这就是我最终为 cypress 所做的(cypress 将文件放在恕我直言的地方,它不应该,如果你在 CI 中缓存 node_modules... 留下这个答案以防其他人遇到与我类似的问题,并找到这个 post.

npm rebuild cypress

万一你像我一样安装了你的一个个人包(没有其他人可以访问),你重新设置了基础然后强制推送到 git,并收到错误:

$ yarn add https://github.com/username/my-rebased-package.git
error Command failed.
Exit code: 128
Command: git
Arguments: pull
Directory: /Users/eric/Library/Caches/Yarn/v6/.tmp/8ebab1a3de712aa3968f3de5d312545b
Output:
error: Pulling is not possible because you have unmerged files.
hint: Fix them up in the work tree, and then use 'git add/rm <file>'
hint: as appropriate to mark resolution and make a commit.
fatal: Exiting because of an unresolved conflict.
info Visit https://yarnpkg.com/en/docs/cli/add for documentation about this command.

您可以通过直接删除缓存文件夹来解决此问题:

$rm -rf /Users/eric/Library/Caches/Yarn/v6/.tmp/8ebab1a3de712aa3968f3de5d312545b

然后就可以安装了。

尝试:

  1. yarn cache clean [<module_name...>]

  2. 纱线添加 []