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

Posted

技术标签:

【中文标题】如何从 Lerna monorepo 中的包中加载包?【英文标题】:How do I load a package from a package in a Lerna monorepo? 【发布时间】:2020-10-03 13:42:13 【问题描述】:

我有:

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'

如何让它正常工作?

【问题讨论】:

【参考方案1】:

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 会注意到这是一个本地包,并会为您安装和链接它。

【讨论】:

【参考方案2】:

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

    cd 包/模型 npm 链接 cd 包/服务器 恢复依赖"@myapp/models": "x.y.z",中的版本 npm 链接@myapp/models

应该够了。

希望这会有所帮助。

【讨论】:

以上是关于如何从 Lerna monorepo 中的包中加载包?的主要内容,如果未能解决你的问题,请参考以下文章

应该如何配置 VSCode 以支持 Lerna Monorepo?

通过 git URL 从 lerna 管理的 monorepo 安装包

如何在不发布的情况下在 lerna monorepo 中构建 docker 镜像

如何使用 TypeScript 设置 Lerna monorepo

我可以为 lerna monorepo 中的所有子包管理相同的版本吗?

nx 和 Lerna 和有啥不一样? (monorepos)