如何通过 Yarn 使用本地路径安装软件包?找不到包

Posted

技术标签:

【中文标题】如何通过 Yarn 使用本地路径安装软件包?找不到包【英文标题】:How to install package with local path by Yarn? It couldn't find package 【发布时间】:2017-02-27 09:35:06 【问题描述】:

在我的package.json 中,我通过其相对路径指向本地包my-custom-i18n

package.json

"dependencies": 
 "core-js": "^2.4.1",
 "my-custom-i18n": "./../MyProject.Shared/myproject-i18n",
 "rxjs": "5.0.0-beta.12",
 ...

npm install 正确安装包,但yarn 有问题,根本找不到这个包:

纱线产量

$ yarn
yarn install v0.15.1
info No lockfile found.
[1/4] Resolving packages...
error Couldn't find package "myproject-i18n" on the "npm" registry.
info Visit http://yarnpkg.com/en/docs/cli/install for documentation about this command.

我看到它在 npm 注册表中找到了它,而这个包并不存在。

问题

在本地包中使用 yarn 有什么变化吗? 本地包是指相对路径指向的包my-custom-i18n

【问题讨论】:

【参考方案1】:

对于纱线版本

Yarn 需要前缀 file: 用于本地包。

相对路径:

yarn add file:./../your-project

对于绝对路径

yarn add file:/dev/your-project

对于您的示例,package.json 中的依赖项将声明如下:

 "my-custom-i18n": "file:./../MyProject.Shared/myproject-i18n",

这也适用于 Yarn 和 NPM。

它与 NPM 客户端不兼容,Yarn 团队意识到并声明支持这种行为 - reference on GitHub issue。

更新:

v0.21.0 版本以来,不需要file: 前缀。 请参阅pull-request with fix 和changelog。

【讨论】:

谢谢,就像一个魅力。但如果它现在与 npm 客户端不兼容 - 我将保留 npm 原样:) PS 我的想法是仅在本地使用 yarn 而无需转换整个团队和项目。所以..我将不得不等到支持这个:) 确保清除缓存。因为纱线总是先尝试缓存版本 +1 更新!删除 file: 前缀解决了我们遇到的问题,Windows 上的 yarn install 会将 ./ 前缀添加到相对文件路径,但 macOS 上的 yarn install 会删除它。 似乎使用 yarn 1.17.3 file: 前缀在以下情况下仍然是必需的:假设您有包 bar,它具有本地依赖项 ./dependencies/xyz。如果另一个包foo 正在使用包bar,它将尝试解析./dependencies/xyz 相对于foo 目录而不是相对于bar 目录。将依赖项更改为file:./dependencies/xyz 后,问题已解决。 万一其他人遇到这个问题:我在获取 yarn workspace 项目中的本地依赖项以在 Github Actions CI 上正确安装时遇到问题。将显式 file: 添加到单个工作区 package.json 中的路径允许 CI 正确解析依赖关系。【参考方案2】:

我用 yarn 尝试了file: 解决方案,但从未成功。我选择了直接包含包裹的不同途径。我能够添加 watch 以在文件更改时自动重建和更新浏览器。

我的情况

我有一个包含两个目录的 git 存储库:example/ 和 react-highlight-within-testarea/(下面我将简化为 mylib/)。 example/ 是一个 react 应用程序,在 example/package.json 中具有以下依赖项:"mylib": "file:../mylib/" (a) 并包含在 example/src/ 中import MyLib from 'mylib' 的 App.js

我的解决方案

    example/package.json 中删除 mylib

    yarn remove mylib

    使分发成为我项目的一部分。

    (cd example/src && ln -s ../../mylib/dist mylib)

    更改example/src/App.js中的包含。

    import MyLib from './mylib'

    mylib 中安装手表。

    (cd mylib ; yarn add watch)

    mylib/package.json (b) 的 scripts 中添加监视命令。

    "watch": "watch 'yarn build' src",

    我现在在终端 (c) 中运行它。

    (cd mylib && yarn install && yarn watch &)
    (cd example && yarn install && yarn start)
    

成功

现在,每当我进行更改并将其保存在 mylib/src/example/src/ 中时,它都会被重建并推送到我浏览器中的 React 页面.


脚注

(a) 这些之前的设置是使用 package.json 来完成这项工作的众多尝试之一。

(b) 可能有更正确的方法可以做到这一点,但它对我有用。

(c) 我也可以把它做成一个 yarn 脚本。

【讨论】:

你运行的是哪个版本的纱线?此解决方案适用于 v.1(我将使用此信息更新答案) 我的 yarn 版本是 1.22.10。代码是 github.com/lonekorean/highlight-within-textarea 。目前我的解决方法是成功的,但反应时间不是很敏捷,但我正忙于与 CSS 和 DOM 作斗争,无法尝试更改为 正确 解决方案。【参考方案3】:

如果您想简单地链接到本地​​包(因此无需重新安装即可获取本地包中的更改):

yarn add link:./../your-project

在yarn docs上查看更多信息

【讨论】:

以上是关于如何通过 Yarn 使用本地路径安装软件包?找不到包的主要内容,如果未能解决你的问题,请参考以下文章

yarn 配置全局安装位置到D盘,解决tsc找不到问题。

通过 npm 安装后找不到 yarn 命令

找不到使用纱线安装的软件包中的命令?

系统找不到指定路径,如何解决?

Spark在本地运行但在YARN中运行时找不到文件

使用 sudo 运行时找不到命令