如何在 Angular / nx 工作区的上下文中运行 nestjs-console 命令

Posted

技术标签:

【中文标题】如何在 Angular / nx 工作区的上下文中运行 nestjs-console 命令【英文标题】:How to run nestjs-console commands in context of Angular / nx workspace 【发布时间】:2020-05-05 21:15:24 【问题描述】:

我有一个 NestJS 应用程序作为 Angular / Nx 工作区的一部分。

在嵌套应用程序中,我使用nestjs-console 运行命令(例如加载夹具数据)。

根据nestjs-console docs,这涉及:

    创建console.ts 文件 在 package.json 中添加一个脚本,例如 "console:dev": "ts-node --project apps/api/tsconfig.console.json apps/api/src/console.ts" 调用它,例如与npm run console:dev -- --help

现在我已经使用 Nx 在应用程序之间创建了一个lib of shared code。

这适用于 Angular CLI 下的命令(testserve 等),但可以理解的是,nestjs-console 任务失败:

错误:找不到模块“@my-workspace/my-lib”

所以问题是如何将nestjs-console 命令置于Angular CLI 的控制之下(或以其他方式运行NestJS 命令)。

我觉得应该可以向angular.json 添加一个自定义任务,它使用现有的构建器,然后以某种方式指向控制台命令。 (我觉得我不需要custom builder,但我可能错了)。

我被卡住了,因为我对这个环境不太熟悉,还有angular.json workspace config。

感谢任何帮助,无论是:

方法建议 我可以复制的示例 具体指针

编辑

我尝试直接使用 NestJS Application Context(而不是通过 nestjs-console),并根据 blog post 使用 ts-node 运行它。

这和以前有同样的问题。我认为这个问题与 ts-node 如何处理 tsconfg 中的路径有关。

如果我更改共享代码的导入方式:

import  HeadwordDto  from '@my-workspace/my-lib';

收件人:

import  HeadwordDto  from '../../../../../../libs/my-lib/src';

然后一切正常,但 tslint 抱怨“库导入必须以 @my-workspace/ (nx-enforce-module-boundaries) 开头。”我可以看到这如何破坏了 Nx 的观点。

另外,处理我认为是paths issue 的东西看起来有点麻烦,并且涉及到tspath 或module-alias 之类的工具。它也没有受益于 Nx 的好处。

我现在向 angular.json 添加了一个新的Architect target,它就像build 目标(使用@nrwl/node:build 构建器),除了构建所需的应用程序上下文:

"build-console": 
  "builder": "@nrwl/node:build",
  "options": 
    "main": "apps/api/src/console.ts",      // build console application context
    "outputPath": "different/output/path",  // can run alongside app
    ...
  
,

构建完成后,它可以是run via node:

node ./different/output/path/main.js –help

编辑 2

在上述方法的基础上,还可以使用execute builder 在单独的终端窗口中不断构建控制台应用程序上下文:

"serve-console": 
  "builder": "@nrwl/node:execute",
  "options": 
    "buildTarget": "api:build-console",
    "port": 7778,
    "args": ["--help"]
  
,

从这里我猜下一步可能是将控制台应用程序上下文变成一个单独的应用程序,在 angular.json 中有自己的项目,然后只需拉入所需的代码。开始觉得 Nx 团队比我领先 58 步;-)

不确定这是否是最佳解决方案,但它确实有效。和以前一样,任何建议都值得赞赏!

编辑 3

为了对此进行扩展,以回应@Digitrance 的问题。我最终使用的方法是:

angular.json


    ...
    "api": 
      ...
      "architect": 
        ...
        "build-console": 
          "builder": "@nrwl/node:build",
          "options": 
            "outputPath": "dist/apps/api-console",
            "main": "apps/api/src/console.ts",
            "tsConfig": "apps/api/tsconfig.app.json"
          
        ,
        "serve-console": 
          "builder": "@nrwl/node:execute",
          "options": 
            "buildTarget": "api:build-console",
            "port": 7778,
            "args": ["--help"]
          
        ,

/my-repo/apps/api/src/console.ts

import  BootstrapConsole  from 'nestjs-console';
import  AppModule  from './app/app.module';

const bootstrap = new BootstrapConsole(
  module: AppModule,
  useDecorators: true
);
bootstrap.init().then(async app => 
  try 
    await app.init();
    await bootstrap.boot();
    process.exit(0);
   catch (e) 
    console.error('Error', e);
    process.exit(1);
  
);

然后是运行控制台的命令:

ng run api:build-console
ng run api:serve-console

node ./dist/apps/api-console/main.js --help
node ./dist/apps/api-console/main.js myCommand

(请注意,api 是我的应用程序的名称)。

希望这会有所帮助!

【问题讨论】:

【参考方案1】:

和你一样,我在设置时遇到了麻烦。我的错误归结为语法错误,根据 ts-node github 上的一些问题,这与节点无法正确读取导入有关,因为它是 commonjs 语法。我的解决方案如下:

    在您的 nx 应用程序中将 tsconfig.console.json 添加到 tsconfig.app.json 旁边。 确保 tsconfig.console.json 在"compilerOptions" 中包含"module": "commonjs"。除此之外,我复制了 tsconfig.app.json。 在 package.json 中添加以下行:"console:dev": "ts-node --project apps/api/tsconfig.console.json -r tsconfig-paths/register apps/api/src/console.ts" 到您的脚本中。

希望它对您或其他人有所帮助。

【讨论】:

谢谢。最后我的感觉是,nestjs-console 文档中的ts-node 是一条红鲱鱼。 Angular CLI / nx 的特性之一是它提供了许多将 TypeScript 文件构建到 JS 中的方法。我最终在 angular.json 中使用新的架构师目标进行构建,而不是使用 ts-node。 @DerekHill 您能否分享一下您的解决方案的代码示例? 好的@Digitrance。我已经编辑了我的问题以包含更多示例代码。希望这会有所帮助。

以上是关于如何在 Angular / nx 工作区的上下文中运行 nestjs-console 命令的主要内容,如果未能解决你的问题,请参考以下文章

Storybook Angular NX 工作区:如何使用 Chromatic 发布?

无法在我的 NX 工作区中使用 @angular-service-worker

在 Angular nx 项目中导入 JavaScript 模块

我可以在一个 Nx 工作区中将 NX CLI 用于 Angular 和 React 应用程序吗?

nrwl/nx 原理图创建 Angular 应用程序并配置 Angular json

为啥 nrwl/nx 比 angular@6 vanilia 更好?