如何从Lerna monorepo中的包裹加载包裹?

时间:2020-06-13 22:31:42

标签: node.js typescript npm 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'

如何使它正常工作?

2 个答案:

答案 0 :(得分:2)

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

typings

如您所见,我使它们都指向某个// packages/models/package.json { // ... "main": "dist/index.js", "types": "dist/index.d.ts", // ... } 文件夹,这将我带到第二点-您将需要构建每个软件包,就好像它是monorepo之外的一个单独的NPM模块一样。我并不是说您需要dist文件夹,该文件夹由您自己决定,您只需要确保dist从外部暴露@myapp/models和{{1} },并且这些文件是有效的和现有的maintypes文件。

现在,拼图的最后一部分-您需要声明.js依赖项,就好像它是一个“真实”包一样-您需要指定其版本,而不是指向文件夹:

.d.ts

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

答案 1 :(得分:1)

我不认识Lerna,但是npm link是处理Monorepos的一个很好的工具。

  1. cd软件包/模型
  2. npm链接
  3. cd包/服务器
  4. 将版本还原为依赖项"@myapp/models": "x.y.z",
  5. npm链接@ myapp / models

应该足够了。

希望这会有所帮助。