NodeJS 如何使用pnpm和rush部署Azure功能?

x9ybnkn6  于 2023-06-29  发布在  Node.js
关注(0)|答案(2)|浏览(150)
  • 如何使用pnpm部署Azure函数应用程序?*

我正在使用一个rush monorepo和rush deploy任务,它在本地工作得很好。问题是我无法获取所有的pnpm node_modules依赖项,也无法在云运行时环境中启动Azure函数
此处的最小复制项目:https://github.com/luisnaranjo733/pnpm-rush-azure-functions
在运行rush deploy之后,我在common/deploy路径上得到了一个很好的准备部署项目。当我尝试为我的函数项目部署包含package.json的commmon/apps/functions目录时,Azure Functions大多数情况下都能正常工作,除非我导入一个依赖项,而该依赖项本身又依赖于其他东西。
这是有意义的,因为pnpm node_modules的工作方式,但在这种情况下,它会导致Azure函数的巨大头痛。更多细节请参见下面的屏幕截图
绿色突出显示的node_modules只包含我的项目声明的依赖项。正如预期的那样,只有@azure/service-bus存在,因为这是我的函数项目使用的唯一依赖项。
橙子突出显示的node_modules是pnpm全局内容可寻址模块存储。这就是@azure/service-bus的依赖关系最终成为@azure/core-amqp的地方。
当通过npm run start在本地运行时,我的函数能够从绿色的node_modules解析到@azure/service-bus的导入,并从橙子的node_modules解析其内部依赖关系。当在云运行时环境上运行时,这不起作用:(

我可以部署common/deploy/apps/functions项目,它在云运行时上运行良好,直到我尝试导入@azure/service-bus失败,因为它找不到它的内部依赖项,如@azure/core-amqp。

  • 部署common/deploy/apps/functions文件夹时的云运行时文件系统示例 *

我看到了几条可能的前进道路,但没有明确的赢家

  • 恢复到npm,这很糟糕,因为我真的很想使用pnpm+rush。
  • 配置pnpm来复制和扁平化我的common/deploy/apps/functions/node_modules,使其与npm或yarn无法区分(没有指向全局内容可寻址模块存储的符号链接)。但这就否定了pnpm的全部意义
  • 配置Azure Functions云运行时环境以使用某种pnpm模式,并找出发生了什么并为我解决它

有没有人走过这条路,有没有人说过智慧的话?谢谢,路易斯

w8f9ii69

w8f9ii691#

我正在使用pnpm作为monorepo,其中一个包作为Azure Function应用程序,并且遇到了类似的问题。在这里找到了你的帖子,刚刚让我的工作,所以添加一个答案,希望可以帮助你或其他人谁偶然发现这篇文章。
就像我说的,我有一个Azure Functions应用程序,然后是一些共享包。我的pnpm-workspace.yaml文件看起来像这样:

packages:
  - "functions"
  - "packages/*"

我面临的问题是当试图通过github操作部署时。在Azure Function应用程序包中运行pnpm install后,node_modules以及我需要的所有第三方代码都将符号链接到根node_modules/.pnpm处的虚拟存储。
在构建和部署之后,我注意到函数失败,因为它试图在一个只包含虚拟存储中文件夹路径的文件夹中运行代码。例如,node_modules/@azure/storage-queue没有任何文件,只有../../../node_modules/.pnpm符号链接,因为这些文件在Function App之外,因此没有部署。
我的解决方案有两个关键部分:
1.在根目录下添加.npmrc并添加config node-linker=hoisted
(文件):hoisted - a flat node_modules without symlinks is created. Same as the node_modules created by npm or Yarn Classic.
1.在github action中添加额外步骤,将根node_modules文件夹中的所有文件复制到Azure Function App的node_modules文件夹中:
xcopy node_modules functions\node_modules /s /e /y /i
关于我的项目的其他信息可能会有所帮助:
在我的Azure Function应用程序的tsconfig.json中,我将"include"设置为"./**/*"-构建所有代码,然后我还为每个共享包设置了"node_modules/<shared package>/**/*"
然后在"compilerOptions"中,我将"paths"设置为dist文件夹中的输出。
希望这有帮助!

wmtdaxz3

wmtdaxz32#

您可以使用cp -LR来解析符号链接:

- name: 'Resolve Project Dependencies Using pnpm'
        shell: bash
        run: |
          pushd './${{ env.AZURE_FUNCTIONAPP_PACKAGE_PATH }}'
          pnpm install
          cp -LR node_modules tmp && rm -rf node_modules && mv tmp node_modules
          pnpm run build
          popd

相关问题