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

Posted

技术标签:

【中文标题】在 nx 构建/部署上生成 package.json【英文标题】:Generate package.json on nx build / deployment 【发布时间】:2019-12-28 04:18:21 【问题描述】:

我有一个使用 nx 和多个 node/nestjs 应用程序的 monorepo。某些应用程序不需要其他应用程序中使用的所有包。因为它是一个 monorepo,所以我需要在部署期间为每个应用程序安装所有包。

有没有办法在构建时生成一个 package.json,它只包含我正在构建的应用程序所需的包?

我尝试使用“generate-package-json-webpack-plugin”来生成 package.json,但它只检测到一半的依赖项。

我也尝试构建一个包含所有应用程序的单个 js 文件,但它似乎不起作用并且总是需要 tslib。

【问题讨论】:

【参考方案1】:

我看了nx源代码后找到了答案。

workspace.json 中将generatePackageJson 设置为true,其中<project-name>/targets/build/options

这将为您生成 package.json,其中包含您的应用所需的依赖项。

这里的例子:

"node-api": 
      "root": "apps/node-api",
      "sourceRoot": "apps/node-api/src",
      "projectType": "application",
      "prefix": "node-api",
      "targets": 
        "build": 
          "executor": "@nrwl/node:build",
          "outputs": ["options.outputPath"],
          "options": 
            "showCircularDependencies": false,
            "outputPath": "dist/apps/node-api",
            "main": "apps/node-api/src/main.ts",
            "tsConfig": "apps/node-api/tsconfig.app.json",
            "assets": ["apps/node-api/src/assets"],
            "generatePackageJson": true <----------------------
          ,
....

【讨论】:

它在最新版本上是如何工作的?好像'generatePackageJson' is not found in schema 这就是我得到的。 @hackp0int nx.dev/node/webpack#generatepackagejson【参考方案2】:

Nx 鼓励单一版本的政策,并且只有一个 package.json。

如果问题是您每次都在构建之前在 CI 中安装所有依赖项,那么您可能需要依赖 CI 系统提供的功能在运行之间缓存这些依赖项 - 许多现有的 CI 系统确实提供了这些: * Gitlab:https://docs.gitlab.com/ee/ci/caching/ * 圈子:https://circleci.com/docs/2.0/caching/ * 特拉维斯:https://docs.travis-ci.com/user/caching/

然而,这也带来了一系列问题(例如,一个或多个正在更改依赖项的并行作业)。

我们可以尝试在 Nx 中使用一个命令:类似于“affected:dep-install”,它将检测哪些软件包作为受影响命令的一部分安装。请在此处为其创建问题:https://github.com/nrwl/nx/issues

【讨论】:

感谢您的回答。问题不在于 CI,而更多在于部署。如果我有一个具有 500MB+ 依赖项的应用程序,并且我需要编写一个与主应用程序一起使用的微服务。当微服务几乎不需要任何包时,为微服务安装所有包感觉是错误的。经过一番研究,这里有一个未解决的问题:github.com/nrwl/nx/issues/1518 嗯,这应该不会影响部署。构建时,您只会捆绑您使用的那些依赖项。在此示例中,您最终会得到两个捆绑包;一个用于您的客户端应用程序,另一个用于您的微服务。微服务只有它需要的代码(不包括客户端代码) 虽然您需要安装依赖项才能开始构建,但您的工件不会包含您的整个 node_modules - 只有您实际使用的代码(通过摇树) 当您运行像 next.js 这样的服务器时,您需要安装生产依赖项来运行应用程序,并且 nx 存储库在根目录中只有一个列表,因此您可以获得所有内容。现在,当您在 docker 容器中执行此操作时,您现在有一个 1~2GB 的映像,对于一个小型服务来说可能只有 200mb。如果您想在处理冷启动的无服务器平台上运行此映像,这尤其有害。我同意 NX 应该提供一种更好的方式来使用 install production dependencies only for this app 命令 就像@MakuraYami 说的那样。 Electrichead 您将 Web 应用程序与服务器应用程序混淆了。您不能将所有服务器代码捆绑到一个与 Web 应用程序相同的 js 文件中。

以上是关于在 nx 构建/部署上生成 package.json的主要内容,如果未能解决你的问题,请参考以下文章

无法在 Android Studio 上生成签名包

使用 ant 项目的 jenkins 集成在 svn 上生成 jar

JWT Token 不会在 Heroku 上生成

如何在 Nrwl Nx 中集成 firebase

Beanstalk:如何将服务器上生成的文件同步回 beanstalk 存储库?

Apollo Android 客户端 - 无法访问类路径上生成的类