Skip to content

Nest CLI 与脚本

本节补充说明 nest 命令如何与编译器及脚本协同工作,以帮助 DevOps 人员更好地管理开发环境。

Nest 应用本质上是一个标准的 TypeScript 应用,在执行前需要先编译成 JavaScript。完成这个编译步骤有很多方法,开发者或团队可以自由选择最适合自己的方案。在此基础上,Nest 提供了一组开箱即用的工具,目标如下:

  • 提供一套标准的命令行构建/执行流程,并带有合理默认值,做到“开箱即用”
  • 保证这套构建/执行流程是开放的,让开发者可以直接访问底层工具,并通过原生功能和参数进行定制
  • 保持其本质上仍然是一个完全标准的 TypeScript/Node.js 框架,因此整个编译 / 部署 / 执行流水线都可以交给团队自行选择的外部工具来管理

这个目标是通过 nest 命令、本地安装的 TypeScript 编译器,以及 package.json 中的脚本三者配合实现的。下面会介绍这些技术是如何协同工作的,帮助你理解构建/执行流程中每一步到底发生了什么,以及在必要时该如何定制其行为。

nest 二进制

nest 命令是一个操作系统层面的二进制命令(也就是在命令行中直接运行的那个命令)。这个命令实际上涵盖了下面三个不同的领域。我们建议你通过项目自动生成的 package.json 脚本来执行构建(nest build)和运行(nest start)子命令;如果你不打算执行 nest new,而是希望直接 clone 一个仓库开始,也可以参考 typescript starter

Build

nest build 是对标准 tsc 编译器、swc 编译器(用于标准项目),或 webpack 打包器(通过 ts-loader,用于monorepo)的一层封装。除了开箱即用地处理 tsconfig-paths 外,它本身不会额外引入其他编译特性或步骤。之所以提供这个命令,是因为大多数开发者,尤其是在刚开始使用 Nest 时,通常不需要调整编译器选项(例如 tsconfig.json),而这些配置在某些情况下并不容易掌握。

更多细节请参见 nest build 文档。

Execution

nest start 的逻辑非常简单:它会先确保项目已经完成构建(与 nest build 行为一致),然后以一种可移植且方便的方式调用 node 命令来执行已编译的应用。和构建过程一样,你也完全可以按需定制这个执行流程,无论是通过 nest start 的参数进行微调,还是完全替换它。整个流程本质上依然只是一个标准 TypeScript 应用的编译与执行流水线,你可以像管理任何普通 TypeScript 应用那样管理它。

更多细节请参见 nest start 文档。

Generation

顾名思义,nest generate 系列命令用于生成新的 Nest 项目,或在项目中生成新的组件。

Package scripts

如果你直接在操作系统层面运行 nest 命令,那么要求 nest 二进制已经被全局安装。这是 npm 的标准机制,不属于 Nest 本身控制的范围。这样做带来的一个结果是:全局安装的 nest 二进制不会作为项目依赖记录在 package.json 中。例如,不同开发者机器上可能运行着不同版本的 nest 二进制。解决这一问题的标准做法,就是通过 package scripts 来运行命令,从而把构建与执行过程中所需的工具都纳入项目的开发依赖管理。

当你执行 nest new,或者 clone typescript starter 时,Nest 会在新项目的 package.json 中自动加入诸如 buildstart 之类的脚本,同时也会将底层编译工具(例如 typescript)安装为开发依赖

你可以通过如下命令运行构建和执行脚本:

bash
$ npm run build

以及:

bash
$ npm run start

这些命令会借助 npm 的脚本执行能力,使用本地安装nest 二进制来执行 nest buildnest start。通过使用这些内置 package scripts,你就可以对 Nest CLI 命令本身实现完整的依赖管理*。也就是说,按照这种推荐方式使用时,团队中的所有成员都可以保证运行的是同一版本的命令。

*这里只适用于 buildstart 命令。nest newnest generate 不属于构建 / 执行流水线,因此它们运行在不同上下文中,也不会自动附带 package.json 脚本。

对于绝大多数开发者和团队,我们都推荐使用 package scripts 来构建和运行 Nest 项目。你可以通过它们的命令行参数(例如 --path--webpack--webpackPath)以及 tsconfig.jsontsc 或 webpack 配置文件,完全定制这些脚本的行为。你也完全可以自定义一整套构建过程,例如自行编译 TypeScript,甚至直接用 ts-node 运行 TypeScript。

向后兼容

由于 Nest 应用本身就是纯 TypeScript 应用,所以旧版本的 Nest 构建 / 执行脚本仍然可以继续工作。你并不需要强制升级它们。你可以在准备好之后再迁移到新的 nest buildnest start 命令,或者继续沿用旧的、甚至是你自己定制过的脚本。

迁移

虽然你并不必须做任何修改,但如果你希望从 tsc-watchts-node 等工具迁移到新的 CLI 命令,可以先同时在全局和本地安装最新版 @nestjs/cli

bash
$ npm install -g @nestjs/cli
$ cd /some/project/root/folder
$ npm install -D @nestjs/cli

然后你可以把 package.json 中的 scripts 替换为下面这些:

json
"build": "nest build",
"start": "nest start",
"start:dev": "nest start --watch",
"start:debug": "nest start --debug --watch"

基于 NestJS 官方文档翻译