如何用Yarn安装本地路径的包?它无法找到包裹

mic*_*ukm 79 node.js npm yarnpkg

在我的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",
 ...
}
Run Code Online (Sandbox Code Playgroud)

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.
Run Code Online (Sandbox Code Playgroud)

我看到它在npm注册表中看起来,这个包不存在.

使用当地包装纱线有什么变化吗?通过本地包我的意思是相对路径指向的包my-custom-i18n.

Pio*_*ski 157

纱线需要file:本地包装的前缀.

对于相对路径:

yarn add file:./../your-project
Run Code Online (Sandbox Code Playgroud)

对于绝对路径

yarn add file:/dev/your-project
Run Code Online (Sandbox Code Playgroud)

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

 "my-custom-i18n": "file:./../MyProject.Shared/myproject-i18n",
Run Code Online (Sandbox Code Playgroud)

这也适用于Yarn和NPM.

它与NPM客户端不兼容,Yarn团队知道并声明支持此行为 - 参考GitHub问题.

更新:

v0.21.0发布以来,file:不需要前缀.请参阅带有修复更改日志的pull-request.

  • +1更新!删除`file:`前缀解决了我们在windows上使用`yarn install`将相对文件路径添加`./`前缀的问题,但macOS上的`yarn install`会删除它. (5认同)
  • 确保清除缓存.因为纱线总是首先尝试缓存版本 (2认同)
  • 在纱线“1.17.3”中,在以下情况下,“file:”前缀似乎仍然是必需的:假设您有一个包“bar”,它具有本地依赖项“./dependencies/xyz”。如果另一个包“foo”正在使用包“bar”,它将尝试解析相对于“foo”目录的“./dependencies/xyz”,而不是相对于“bar”目录。将依赖项更改为“file:./dependencies/xyz”后,问题得到解决。 (2认同)
  • 万一其他人发现了这一点:我在获取“yarn工作区”项目中的本地依赖项以在 Github Actions CI 上正确安装时遇到问题。将显式的“file:”添加到单个工作区“package.json”中的路径允许 CI 正确解析依赖关系。 (2认同)

cda*_*uth 40

对于纱线版本 >= 2.x (Yarn Berry)

\n

为了引用本地包,Yarn 支持不同的协议

\n
    \n
  • file:创建指定目录的副本。这意味着如果您对本地包进行更改,则需要yarn install再次运行以复制其新版本。当指定相对路径(以./或开头../)或绝对路径(以 开头/)时,file:也可以省略前缀。
  • \n
  • portal:创建到指定目录的符号链接并解决其传递依赖关系。
  • \n
  • link:创建到指定目录的符号链接,但不解析其传递依赖项。令人困惑的是,这相当于 NPM\xe2\x80\x99sfile:协议。
  • \n
\n

要添加依赖项,请运行yarn add your-project@file:../your-project.

\n

尝试运行yarn add file:../your-project(不带your-project@前缀)将导致以下错误:Usage Error: The file:../your-project string didn\'t match the required format (package-name@range). Did you perhaps forget to explicitly reference the package name?

\n

不同协议之间的一个重要区别是它们解决依赖关系的方式。让\xe2\x80\x99s 说你有一个a依赖于本地包的包b。在link:模式下,您必须yarn install在 中运行b,而在portal:file:模式下,yarn installa安装b\xe2\x80\x99s 依赖项,就像安装任何其他依赖项一样。如果两个包都依赖于 library mylib,则在link:模式下,库将被复制为a/node_modules/mylibb/node_modules/mylib,这可能会导致某些库出现问题(因为缓存可能会重复,并且instanceof由于构造函数是重复的,因此运算符不会按预期工作\xe2\x80\x99)。因此,我始终建议使用portal:本地依赖项并清除依赖项node_modules的文件夹b

\n


mr.*_*rre 29

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

yarn add link:./../your-project
Run Code Online (Sandbox Code Playgroud)

查看更多关于纱线文档