【发布时间】: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 下的命令(test;serve 等),但可以理解的是,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 是我的应用程序的名称)。
希望这会有所帮助!
【问题讨论】:
标签: angular angular-cli nestjs nrwl nrwl-nx