繁体   English   中英

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

[英]How to run nestjs-console commands in context of Angular / nx workspace

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

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

根据nestjs-console 文档,这涉及:

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

现在我已经使用 Nx 在应用程序之间创建了一个共享代码库

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

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

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

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

我被卡住了,因为我对这个环境和angular.json 工作区配置不太熟悉。

任何帮助表示赞赏,无论是:

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

编辑

我尝试直接使用 NestJS应用程序上下文(而不是通过nestjs-console )并根据这篇博客文章使用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 的观点。

或者,处理我认为的路径问题看起来有点麻烦,并且涉及tspathmodule-alias等工具。 它也没有受益于 Nx 的好处。

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

"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
    ...
  }
},

构建完成后,它可以通过 node 运行

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

编辑 2

基于上述方法,还可以使用执行构建器在单独的终端窗口中持续构建控制台应用程序上下文:

"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是我的应用程序的名称)。

希望这可以帮助!

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

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

希望它可以帮助您或其他任何人。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM