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 中自动加入诸如 build、start 之类的脚本,同时也会将底层编译工具(例如 typescript)安装为开发依赖。

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

bash
$ npm run build

以及:

bash
$ npm run start

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

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

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

向后兼容 ​

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

迁移 ​

虽然你并不必须做任何修改,但如果你希望从 tsc-watch、ts-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 官方文档翻译