首页 > 解决方案 > 如何从 Lerna monorepo 中的包中加载包?

问题描述

我有:

packages
 -models
   -package.json
   -....
 -server
   -src
     -index.ts
   -package.json

在我的packages/server/package.json,我有:

  "scripts": {
    "dev": "ts-node src/index.ts"
  },
  "dependencies": {
    "@myapp/models": "../models",

在我的packages/server/src/index.ts,我有:

import { sequelize } from '@myapp/models'

在我的packages/models/src/index.ts,我有:

export type UserAttributes = userAttr


export { sequelize } from './sequelize';

但它给了我一个错误:

  Try `npm install @types/myapp__models` if it exists or add a new declaration (.d.ts) file containing `declare module '@myapp/models';`

 import { sequelize } from '@myapp/models'

我怎样才能让它正常工作?

标签: node.jstypescriptnpmlernamonorepo

解决方案


Lerna 将处理本地包之间的依赖关系,您只需要确保正确设置它们即可。我建议的第一件事是去@myapp/models确保您package.json包含您需要的字段:main更重要的是types(或者typings如果您愿意):

// packages/models/package.json

{
  // ...
  "main": "dist/index.js",
  "types": "dist/index.d.ts",
  // ...
}

正如你所看到的,我让它们都指向某个dist文件夹,这将我带到了我的第二点——你需要构建每个包,就好像它是 monorepo 之外的一个单独的 NPM 模块一样。我并不是说你需要这个dist文件夹,你在哪里构建它取决于你,你只需要从外部确保你的@myapp/models暴露maintypes这些是有效的和现有的.js文件.d.ts

现在对于拼图的最后一块 - 你需要声明你的@myapp/models依赖,就好像它是一个“真实的”包 - 你需要指定它的版本而不是指向一个文件夹:

// packages/server/package.json

{
  "dependencies": {
    // ...
    "@myapp/models": "0.0.1" // Put the actual version from packages/models/package.json here
    // ...
  }
}

Lerna 会注意到这是一个本地包,并将为您安装和链接它。


推荐阅读