在 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的主要内容,如果未能解决你的问题,请参考以下文章
使用 ant 项目的 jenkins 集成在 svn 上生成 jar