16

我们开始采用使用 yarn 工作区的 monorepo 设置,我们希望在其中包含我们的 firebase 功能。回购结构类似于:

repo
    node_modules <- all dependencies
    packages
        core
        commom
        functions <- firebase functions

所以,这个设置我有两个问题:

  1. 函数的依赖项与函数的入口文件不在同一个文件夹中
  2. 这些功能取决于 repo 中的其他包,例如corecommom,因此 yarn 符号链接从 node_modules 到 repo 中的包。

无论如何我可以处理这个吗?

4

3 回答 3

3

使用Yarn 2 node_modules不会被提取并放入相应的functions目录中(就像npm ifunctions目录中调用的情况一样)。因此,当调用firebase deploy --project default --only functionnode_modules文件夹时,firebase 会抱怨这一点并中止部署过程并出现以下错误(或类似错误):

Error parsing triggers: Cannot find module [...]
Try running "npm install" in your functions directory before deploying.

目前有两个 github 问题正在跟踪此问题:

在上面的两个问题中,firebase 用户提出了几个巧妙的解决方法,例如使用 webpack 创建包含发布中所有本地包的构建,或者使用 rsync 或其他工具在发布前重新连接包。

如果可能的话,另一个解决方案是不提升您的项目包。您可以这样做,将以下两个指令添加到您的.yarnrc.yml文件中。

# yarnrc.yml

# disables yarn's plugnplay style and uses node_modules instead
nodeLinker: node-modules
# makes sure the node_modules are not hoisted to the (monorepo) project root
nmHoistingLimits: "dependencies"

上面的两个指令在yarnrc 配置文档中解释如下:

nmHoistingLimits定义可以吊起包裹的最高点。工作区之一(不要将包提升到依赖于它们的工作区)、依赖项(不将包提升到每个工作区的直接依赖项之外)或无(默认情况下,尽可能多地提升包)。可以通过 installConfig.hoistingLimits 字段覆盖每个工作区的此设置。

nodeLinker定义应该使用什么链接器来安装 Node 包(用于启用 node-modules 插件),其中之一是:pnp、node-modules。

于 2021-05-06T19:33:35.553 回答
2

nohoist我为此找到的解决方案是您的根package.json文件中的 Yarn选项。

默认情况下,Yarn 将依赖项提升到根目录,以便它们可以在您的包之间共享。不幸的是,这不适用于 Firebase。这意味着您需要告诉 Yarn 不要提升 Firebase 函数使用的依赖项。

的文档nohoist不太理想,但这里有一篇关于它的官方博客文章: https ://yarnpkg.com/blog/2018/02/15/nohoist/

你可能想要这样的东西:

{
  "workspaces": {
    "packages": [
      "packages/*"
    ],
    "nohoist": [
      "functions/core",
      "functions/common",
      "functions/**"
    ]
  }
}

请记住,这使用了每个工作区包name的文件中使用的字段。package.json所以在这个例子中,假设functions目录有一个package.json带有“functions”的name.

functions/**告诉 yarn 不要提升packages/functions/package.json. 但是,这不适用于您的共享纱线包,因此functions/core需要functions/common单独指定。

您还需要将工作空间作为依赖项包含在functions项目中,因此将它们添加到您的package.json

{
  "name": "functions",
  "dependencies": {
    "core": "*",
    "common": "*",
  }
}

添加完所有内容后,您应该删除packages/functions/node_modules目录并运行yarn install. 完成此操作后,您应该会看到所有依赖项都包含在packages/functions/node_modules(不是符号链接)中。

于 2020-01-04T18:37:12.337 回答
-1

我不确定我是否完全理解这个问题,但我可以根据我从你的问题和我使用它的经验中了解到的任何内容,在纱线工作区上给你两分钱。

Yarn 工作区将所有依赖项整合到项目根目录中的node_modules以及单个package-lock.json中,以减少冲突并使 yarn 能够优化安装过程,从而为您提供更快的yarn install. 它的另一个优点是,一次通过yarn install就可以安装工作区下所有包的依赖项。

编辑:我认为由于某种原因yarn link没有被调用,而只是yarn install在运行,它将搜索 npm 注册表并抛出评论中提到的错误,因为它在 npm 注册表上找不到提到的包。因此,对于解决方案,请尝试在 firebase 的 package.json 中创建一个条目,例如

"dependencies": {
  "a": "file:../dependency-package-name/",
}
于 2019-06-10T06:59:24.407 回答