如何在多模块项目中抽离和共享公共package.json?

假如我有多个模块,每个模块都有一个package.json,我想抽离出公共package.json,让模块公用继承一个通用的package.json,请问有什么好的实现方法吗?

阅读 369
avatarAI BotBETA

回答

在多模块项目中抽离和共享公共的 package.json 并不是一个标准的做法,因为每个 package.json 文件本质上定义了一个独立的 npm 包。然而,你可以通过一些方法来达到类似的效果,即共享依赖项和脚本,同时保持每个模块的独立性。

方法一:使用 lernayarn workspaces

对于多模块项目,lernayarn workspaces 是两种流行的解决方案,它们允许你在一个仓库中管理多个 npm 包,同时共享依赖项。

  • Lerna:
    Lerna 是一个工具,用于管理具有多个包的 JavaScript 项目。通过 Lerna,你可以在一个根目录下拥有多个 npm 包,每个包都有自己的 package.json,但依赖项可以在根级别的 package.json 中定义并共享。
  • Yarn Workspaces:
    Yarn Workspaces 是 Yarn 包管理器内置的功能,允许你设置工作区(workspace),这些工作区可以共享依赖项。每个工作区仍然有自己的 package.json,但你可以通过配置 yarn.lock 和根级别的 package.json 来管理共享的依赖项。

方法二:使用 monorepo 结构

采用 monorepo(单体仓库)结构,你可以将所有模块放在同一个仓库中,但每个模块仍然保持其独立的 package.json。通过使用 lernayarn workspaces,你可以更高效地管理这些模块及其依赖项。

实现步骤(以 Yarn Workspaces 为例):

  1. 初始化项目:
    创建一个新的项目目录并初始化一个新的 npm 项目。

    mkdir my-monorepo
    cd my-monorepo
    npm init -y
  2. 启用 Yarn Workspaces:
    在根目录下的 package.json 中添加 "workspaces": ["packages/*"](假设你的模块放在 packages 目录下)。
  3. 创建模块:
    packages 目录下为每个模块创建一个目录,并在每个目录中初始化一个新的 npm 项目。

    mkdir packages
    cd packages
    mkdir moduleA
    cd moduleA
    npm init -y
    # 重复上述步骤为其他模块(如 moduleB, moduleC 等)
  4. 安装依赖:
    在根目录下安装所有依赖项。这些依赖项将在所有工作区中共享。

    cd ../../
    yarn add some-shared-dependency
  5. 在模块中引用依赖:
    每个模块可以单独安装自己的依赖项,也可以引用根级别安装的共享依赖项。

通过这种方式,你可以有效地管理多模块项目中的依赖项,同时保持每个模块的独立性。虽然每个模块仍然有自己的 package.json,但你可以通过根级别的配置来共享和管理依赖项。

1 个回答

推荐使用 Yarn WorkspacesPnpm Workspaces 的方法:

使用 Yarn Workspaces

1.创建根目录的 package.json 文件: 在项目根目录下创建一个 package.json 文件,并添加 workspaces 字段:

{
  "private": true,
  "workspaces": [
    "packages/*"
  ]
}

2.创建模块目录: 在 packages 目录下为每个模块创建一个子目录,每个子目录中包含一个 package.json 文件。例如:

project-root/
├── packages/
│   ├── module1/
│   │   ├── package.json
│   │   └── src/
│   ├── module2/
│   │   ├── package.json
│   │   └── src/
├── package.json

3.安装依赖: 在项目根目录下运行 yarn install,Yarn 会自动安装所有模块的依赖,并将它们链接到根目录的 node_modules 中。

使用 Pnpm Workspaces

1.创建根目录的 package.json 文件: 在项目根目录下创建一个 package.json 文件,并添加 workspaces 字段:

{
  "private": true,
  "workspaces": [
    "packages/*"
  ]
}

2.创建 pnpm-workspace.yaml 文件: 在项目根目录下创建一个 pnpm-workspace.yaml 文件,并添加以下内容:

packages:
  - "packages/*"

3.创建模块目录: 在 packages 目录下为每个模块创建一个子目录,每个子目录中包含一个 package.json 文件。例如:

project-root/
├── packages/
│   ├── module1/
│   │   ├── package.json
│   │   └── src/
│   ├── module2/
│   │   ├── package.json
│   │   └── src/
├── package.json
└── pnpm-workspace.yaml

4.安装依赖: 在项目根目录下运行 pnpm install,Pnpm 会自动安装所有模块的依赖,并将它们链接到根目录的 node_modules 中。

补充

Yarn Workspaces

优点:

  • 简单易用:配置简单,易于上手。
  • 广泛使用:社区支持广泛,文档丰富。
  • 与 Lerna 结合:可以与 Lerna 结合使用,提供更强大的版本管理和发布功能。

缺点:

  • 性能:在处理非常大型项目时,性能可能不如 Pnpm。

Pnpm Workspaces

优点:

  • 高效依赖管理:通过硬链接和符号链接节省磁盘空间,安装速度快。
  • 性能优越:在大型项目中表现出色,依赖管理更高效。
  • 分布式缓存:支持分布式缓存,进一步提升构建速度。

缺点:

  • 相对较新:虽然越来越受欢迎,但社区支持和文档可能不如 Yarn 丰富。

总结

  • 大型项目:推荐使用 Pnpm Workspaces。
  • 中小型项目:推荐使用 Yarn Workspaces
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏