在 Nx 工作区中运行 NestJS 构建工件时出错

Posted

技术标签:

【中文标题】在 Nx 工作区中运行 NestJS 构建工件时出错【英文标题】:Error when running NestJS build artifact in Nx workspace 【发布时间】:2020-01-21 22:36:37 【问题描述】:

当我尝试运行在 Nx 工作区中创建的 NestJS 应用程序的构建工件时,我遇到了错误。仅当我在不存在 node_modules 文件夹的存储库之外的任何位置运行生成的工件时,才会发生该错误。

重现步骤:

    克隆这个仓库https://github.com/baumgarb/proxy-example 运行npm install 安装所有包 运行ng build backend 进入dist/apps/backend中的dist文件夹 在该文件夹中运行node main.js,您应该会看到后端成功启动 现在将 main.js 复制到克隆存储库之外的其他位置(例如 /tmpc:\temp) 在新位置再次运行node main.js,您将遇到以下错误:

internal/modules/cjs/loader.js:775
    throw err;
    ^

Error: Cannot find module 'tslib'
Require stack:
- /home/bernhard/main.js
    at Function.Module._resolveFilename (internal/modules/cjs/loader.js:772:15)
    at Function.Module._lo[ad (internal/modules/cjs/loader.js:677:27)
    at Module.require (internal/modules/cjs/loader.js:830:19)
    at require (internal/modules/cjs/helpers.js:68:18)
    ...[omitted for brevity] 
  code: 'MODULE_NOT_FOUND',

您也可以尝试在 Docker 容器中运行构建工件,这将导致相同的错误。

这也是我的本地机器和 WSL 的比较:

谁能告诉我问题是什么以及如何解决?提前非常感谢!

【问题讨论】:

对此有任何更新吗? 【参考方案1】:

我在 Nx 工作区中为 Nestjs 应用程序构建 Docker 映像时遇到了这个问题。

我做了以下解决方法:

# BUILD

FROM node:16.11.1-slim as build

WORKDIR /app/nx

COPY nx /app/nx

RUN npm install -g nx@13.1.3 && \
    npm install && \
    nx build backend


# SERVE

FROM node:16.11.1-slim

ARG NODE_ENV=production
ENV NODE_ENV=$NODE_ENV

WORKDIR /app/backend

COPY --from=build /app/nx/dist/apps/backend /app/backend

RUN npm install \
    tslib@2.3.1 \
    @nestjs/common@7.6.18 \
    @nestjs/core@7.6.18 \
    @nestjs/platform-express@7.6.18 \
    @nestjs/axios@0.0.3

EXPOSE 3333
CMD ["node", "/app/backend/main"]

【讨论】:

【参考方案2】:

您的 NestJs 应用程序有一个 tslib 模块依赖项(至少,甚至是其他几个)。

因此,您还应该部署带有所需依赖项的 package.json。 为此,您可以从nx workspace 制作主要开发package.json 的精确副本,或者使用仅对已部署目标具有依赖关系的特定副本。 (避免您的生产托管环境加载大量无用的库)。

在启动您的NestJs 应用程序之前不要忘记致电npm install

【讨论】:

但是如果你复制 package.json 并运行npm install,它会安装所有不用于nestjs 的包......因为NX 将角度和其他应用程序包放入同一个package.json 文件中。有什么方法可以将 NestJs 项目的所有依赖项都包含在构建中? @microchip78 嗨,你解决了这个问题吗?你知道如何让 nx 为 Nest 应用程序生成单独的 package.json 吗?还是在构建中包含依赖项?

以上是关于在 Nx 工作区中运行 NestJS 构建工件时出错的主要内容,如果未能解决你的问题,请参考以下文章

是否可以在 nx 工作区中使用不同的应用程序作为 git 子模块?

NestJS Graphql webpack 生产构建错误

nrwl/nx 如何使用 npm 发布 NestJs 库?

在 nx 构建/部署上生成 package.json

如何构建运行测试套件的 Maven 工件? “sbt 测试”如何工作?

如何在 NestJS 中跨模块全局注入价值?