繁体   English   中英

如何使用 turborepo 将 monorepo 包与 nestjs 一起使用?

[英]How to use monorepo packages with nestjs using turborepo?

这是使用 turborepo 的带有 nestjs 的真正简单的 monorepo 的样子:

.
├── README.md
├── apps
│   └── nest
│       ├── README.md
│       ├── nest-cli.json
│       ├── package.json
│       ├── src
│       │   ├── app.controller.spec.ts
│       │   ├── app.controller.ts
│       │   ├── app.module.ts
│       │   ├── app.service.ts <---- importing class here
│       │   └── main.ts
│       ├── test
│       │   ├── app.e2e-spec.ts
│       │   └── jest-e2e.json
│       ├── tsconfig.build.json
│       └── tsconfig.json
├── package.json
├── packages
│   └── lib
│       ├── index.ts <------- exporting class here
│       ├── package.json
│       └── tsconfig.json
├── pnpm-lock.yaml
├── pnpm-workspace.yaml
└── turbo.json

class 在packages/lib/index.ts中定义,然后导入到apps/nest/src/app.service.ts中。

但是这样做会在尝试导入此index.ts时导致以下错误:

nest:dev: 
nest:dev: [1:40:25 AM] Found 0 errors. Watching for file changes.
nest:dev: 
nest:dev: /Users/hercule/Workspace/monorepo-nestjs-package/packages/lib/index.ts:3
nest:dev:   public hello() {
nest:dev:          ^^^^^
nest:dev: 
nest:dev: SyntaxError: Unexpected identifier
nest:dev:     at Object.compileFunction (node:vm:360:18)
nest:dev:     at wrapSafe (node:internal/modules/cjs/loader:1088:15)
nest:dev:     at Module._compile (node:internal/modules/cjs/loader:1123:27)
nest:dev:     at Object.Module._extensions..js (node:internal/modules/cjs/loader:1213:10)
nest:dev:     at Module.load (node:internal/modules/cjs/loader:1037:32)
nest:dev:     at Function.Module._load (node:internal/modules/cjs/loader:878:12)
nest:dev:     at Module.require (node:internal/modules/cjs/loader:1061:19)
nest:dev:     at require (node:internal/modules/cjs/helpers:103:18)
nest:dev:     at Object.<anonymous> (/Users/hercule/Workspace/monorepo-nestjs-package/apps/nest/src/app.service.ts:2:1)
nest:dev:     at Module._compile (node:internal/modules/cjs/loader:1159:14)

因此,我们如何将 typescript package 导入到将被正确编译/解析的 nestjs 中?

注意 1:我尝试将此库( index.ts )导入 ne x tjs 应用程序和 angular 应用程序,它没有任何问题。 问题只出现在 nestjs

注 2:可以使用以下存储库复制上面的示例: https://github.com/beneccli/monorepo-nestjs-package ,一旦克隆,在项目的根目录下,只需运行pnpm i然后运行 pnpm pnpm dev (或 npm 或 yarn ).

解决方法其实很简单。

问题是依赖项没有从 typescript 转换为 javascript。

要解决这个问题,需要说明如何构建依赖关系以及在哪里可以找到结果文件。 这是使用lib依赖项的package.json完成的:

// packages/lib/package.json
{
  "name": "lib",
  "version": "0.0.0",
  "main": "./dist/index", <----- NEW
  "types": "./dist/index", <----- NEW
  "scripts": {
    "build": "tsc --build --force tsconfig.json" <----- NEW
  },
  "devDependencies": {
    "typescript": "^4.5.2"
  }
}

我相应地更新了先前给定的存储库。

这里重要的是不要忘记在pnpm install之后运行pnpm build以获得正确的构建依赖项。 然后 nestjs 可以在 dev 或 prod 中启动。

我克隆了一个 repo 并在你的 packages/lib/package.json 中看到以下内容:

  • 您的包(确切地说是 lib)没有构建脚本,所以我添加了一个。
  • Lib main 没有指向 dist/index.js 构建,所以我也修改了 main。

最终库的 package.json 在这里

{
  "name": "lib",
  "version": "0.0.0",
  "main": "./dist/index.js",
  "scripts": {
    "build": "tsc"
  },
  "types": "./index.ts",
  "devDependencies": {
    "typescript": "^4.5.2"
  }
}

完成这些之后,我在根目录中运行脚本pnpm run build

然后我运行pnpm dev ,您的应用程序应该开始在http://localhost:3000/上运行,文本为Test: Hello World!

这背后的事情是你应该有一个构建脚本来将你的 Typescript 代码编译成 JS,然后让 main 准确指向编译后的索引。 这样当 NestJs 使用你的库时,它应该有所有的函数和类在里面。

暂无
暂无

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

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