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

Sug*_*use 6 monorepo nestjs turborepo

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

\n
.\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 README.md\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 apps\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 nest\n\xe2\x94\x82\xc2\xa0\xc2\xa0     \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 README.md\n\xe2\x94\x82\xc2\xa0\xc2\xa0     \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 nest-cli.json\n\xe2\x94\x82\xc2\xa0\xc2\xa0     \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 package.json\n\xe2\x94\x82\xc2\xa0\xc2\xa0     \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 src\n\xe2\x94\x82\xc2\xa0\xc2\xa0     \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 app.controller.spec.ts\n\xe2\x94\x82\xc2\xa0\xc2\xa0     \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 app.controller.ts\n\xe2\x94\x82\xc2\xa0\xc2\xa0     \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 app.module.ts\n\xe2\x94\x82\xc2\xa0\xc2\xa0     \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 app.service.ts <---- importing class here\n\xe2\x94\x82\xc2\xa0\xc2\xa0     \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 main.ts\n\xe2\x94\x82\xc2\xa0\xc2\xa0     \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 test\n\xe2\x94\x82\xc2\xa0\xc2\xa0     \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 app.e2e-spec.ts\n\xe2\x94\x82\xc2\xa0\xc2\xa0     \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 jest-e2e.json\n\xe2\x94\x82\xc2\xa0\xc2\xa0     \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 tsconfig.build.json\n\xe2\x94\x82\xc2\xa0\xc2\xa0     \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 tsconfig.json\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 package.json\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 packages\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 lib\n\xe2\x94\x82\xc2\xa0\xc2\xa0     \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 index.ts <------- exporting class here\n\xe2\x94\x82\xc2\xa0\xc2\xa0     \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 package.json\n\xe2\x94\x82\xc2\xa0\xc2\xa0     \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 tsconfig.json\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 pnpm-lock.yaml\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 pnpm-workspace.yaml\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 turbo.json\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n

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

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

因此,我们如何将 typescript 包导入到 Nestjs 中,以便正确编译/解析?

\n

注 1:我尝试将此 lib ( index.ts) 导入到 ne x tjs 应用程序和 Angular 应用程序中,它可以正常工作,没有任何问题。这个问题只出现在nestjs上

\n

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

\n

Sug*_*use 0

解决办法其实很简单。

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

为了解决这个问题,需要知道如何构建依赖关系以及在哪里可以找到结果文件。这是使用依赖项完成package.jsonlib

// 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"
  }
}
Run Code Online (Sandbox Code Playgroud)

我相应地更新了之前给出的存储库。

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