{"id":42868541,"url":"https://github.com/rni-l/multi-dependent-management","last_synced_at":"2026-01-30T12:52:31.999Z","repository":{"id":57305005,"uuid":"408015514","full_name":"rni-l/multi-dependent-management","owner":"rni-l","description":"批量管理 npm 项目依赖的命令行工具","archived":false,"fork":false,"pushed_at":"2021-10-08T03:21:23.000Z","size":6396,"stargazers_count":2,"open_issues_count":1,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-09-28T13:51:32.940Z","etag":null,"topics":["node-cli","npm"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/rni-l.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2021-09-19T02:45:05.000Z","updated_at":"2025-03-07T06:02:24.000Z","dependencies_parsed_at":"2022-09-20T18:55:01.079Z","dependency_job_id":null,"html_url":"https://github.com/rni-l/multi-dependent-management","commit_stats":null,"previous_names":[],"tags_count":4,"template":false,"template_full_name":null,"purl":"pkg:github/rni-l/multi-dependent-management","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rni-l%2Fmulti-dependent-management","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rni-l%2Fmulti-dependent-management/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rni-l%2Fmulti-dependent-management/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rni-l%2Fmulti-dependent-management/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/rni-l","download_url":"https://codeload.github.com/rni-l/multi-dependent-management/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rni-l%2Fmulti-dependent-management/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28912990,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-30T12:13:43.263Z","status":"ssl_error","status_checked_at":"2026-01-30T12:13:22.389Z","response_time":66,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["node-cli","npm"],"created_at":"2026-01-30T12:52:31.183Z","updated_at":"2026-01-30T12:52:31.976Z","avatar_url":"https://github.com/rni-l.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# multi-dependent-management\n\n\u003e基于 node.js 的命令行工具，用于管理多个项目的依赖。\n\n![](https://img.shields.io/npm/l/multi-dependent-management) ![](https://app.travis-ci.com/rni-l/multi-dependent-management.svg?branch=master) ![Coverage Status](https://coveralls.io/repos/github/rni-l/multi-dependent-management/badge.svg) ![](https://img.shields.io/github/languages/code-size/rni-l/multi-dependent-management)\n\n## 概述\n\n该工具是用于管理多个项目的依赖，根据你输入的路径，递归查询所有的 `package.json`（默认忽略 `node_modules` 文件），进行依赖管理：\n\n1. 依赖批量版本升级（基于 [npm-check-updates](https://github.com/raineorshine/npm-check-updates)）\n2. 依赖批量移除\n3. 依赖批量添加/变更\n4. 查看多项目内的依赖差异\n\n## 安装\n\n```shell\n# 使用 npx 执行\nnpx multi-dependent-management\n# 全局安装\nnpm i multi-dependent-management -g\n\n```\n\n\n\n## 快速使用\n\n### 依赖版本升级\n\n根据你选中的项目，对依赖进行批量升级。注意，这个只是修改你的 `package.json`，而不会执行 `npm install` 。\n\n```shell\n# -p 后面带你要执行的项目路径\nmdm upgrade -p ./project\n```\n\n![](./docs/assets/upgrade01.gif)\n\n首先会递归查询该路径下所有的 `package.json` 文件，然后使用 [npm-check-updates](https://github.com/raineorshine/npm-check-updates) 检查每个项目的依赖版本是否最新，将可以更新的依赖一一展现出来，让你选择哪个依赖需要更新：\n\n![](./docs/assets/upgrade02.jpg)\n\n\n\n### 依赖移除\n\n根据你选中的项目，对依赖进行批量移除。\n\n```shell\n# -p 后面带你要执行的项目路径\nmdm remove -p ./project\n```\n\n![](./docs/assets/remove01.gif)\n\n首先会让你输入要移除的依赖，使用 `,` 分隔每个依赖名。\n\n接着会递归查询该路径下所有的 `package.json` 文件，让你选择哪个项目需要移除依赖。\n\n\n\n### 依赖变更\n\n根据你选中的项目，对依赖进行批量变更。\n\n```shell\n# -p 后面带你要执行的项目路径\nmdm update -p ./project\n```\n\n![](./docs/assets/update01.gif)\n\n首先会让你输入要更新的依赖，使用 `,` 分隔每个依赖名。\n\n接着会让你选择是否安装依赖:\n\n![](./docs/assets/update02.jpg)\n\n如果选择“是”，则会执行 `npm install {package}`，\n\n否则执行：`npm install {package} --package-lock-only`，\n\n最后会递归查询该路径下所有的 `package.json` 文件，让你选择哪个项目需要更新依赖。\n\n变更操作，会使用 `npm install` 进行依赖变更，而不是直接修改 `package.json` 文件，保证包名的顺序一致。\n\n### 查看依赖差异\n\n根据你选中的项目，查看各个项目的依赖版本差异。\n\n```shell\n# -p 后面带你要执行的项目路径\nmdm diff -p ./project\n```\n\n![](./docs/assets/diff01.gif)\n\n`diff` 功能，会根据你选中的项目的依赖版本，返回需要升级的依赖和对应最高的版本。当你选择更新，会修改所有匹配的依赖变为当前最高的版本。\n\n简单来说，就是同步你选中项目所有依赖的版本，变成一样。\n\n`diff` 的更新操作，是直接修改 `package.json`，不会进行依赖安装。\n\n\n\n### 脚本命令执行\n\n该功能根据你选择的项目，批量执行脚本命令。\n\n```shell\n# -p 后面带你要执行的项目路径\nmdm shell -p ./project\n```\n\n![](./docs/assets/shell01.gif)\n\n`shell` 功能，会根据你选中的项目，执行相关的脚本命令，该功能自由度比较高，可以搭配不同的操作。\n\n选完要处理的项目后，会让你先输入都执行的命令，没有的话，不输入保存就行了：\n\n![](./docs/assets/shell02.jpg)\n\n接着就是输入每个项目单独执行的命令：\n\n![](./docs/assets/shell03.jpg)\n\n最后会让你确认是否按照上面的顺序执行：\n\n![](./docs/assets/shell04.jpg)\n\n执行结果：\n\n![](./docs/assets/shell05.jpg)\n\n\n\n### 路径匹配\n\n```shell\n# 过滤 /demo/a/ 下的所有文件夹 和所有子路径中末位是 b 的文件夹\nmdm update -p /demo -e /demo/a/**,**/b\n```\n\n`-p` 参数是从哪个路径开始递归查询，`-e` 参数是对路径进行过滤，支持传入多个值，用 `,` 隔开。\n\n我这里的处理，是将传给 `-e` 的值，转成数组并去空格处理，然后使用 `minimatch(path, {value})` 进行判断，如果返回 `true` 代表命中，则过滤该路径。\n\n详细匹配规则，参考 [minimatch](https://github.com/isaacs/minimatch)。\n\n## 应用场景\n\n我现在日常开发，因为人少系统多，经常是一两个前端去管理多个简单的管理系统，而这些系统都使用内部的组件库进行搭建：\n\n![](./docs/assets/p2.jpg)\n\n如果当我们的组件库有 bug 或者有功能迭代，要多个系统同时去发布修复版，这时候就有下面的流程：\n\n![](./docs/assets/p3.jpg)\n\n有 10  个系统，就要进行 10 次这样的操作，非常麻烦，所以才开发该工具。\n\n使用该工具，只需通过一次或两次命令就可以完成。\n\n两次命令：\n\n```shell\n# 去到对面的目录，添加相关的过滤条件\nmdm upgrade -p ./project -e **/abc,**/abc2\n# 升级完需要的依赖后，执行相关提交命令\nmdm shell -p ./project -e **/abc,**/abc2\n# shell 模式会进行编辑状态，输入：\n# git add ./\n# git commit -m 'fix: 更新依赖，修复 xx 问题'\n# git push origin fix\n```\n\n当执行完上述步骤，对应的项目就会更新选中的依赖，并根据你输入的 `shell` 命令，提交到你的仓库。\n\n一次命令：\n\n```shell\n# 可以直接通过 shell 命令，一次完成\nmdm shell -p ./project -e **/abc,**/abc2\n# shell 模式会进行编辑状态，输入：\n# npm i abc@1.1.0 -S\n# git add ./\n# git commit -m 'fix: 更新依赖，修复 xx 问题'\n# git push origin fix\n```\n\n\n## TODO\n\n1. ~~添加操作命令的配置项，比如文件匹配限制~~\n2. ~~添加命令行操作，可以对项目批量执行 shell 命令~~\n3. ~~添加依赖差异查看命令，查询匹配的项目，查看项目内每个依赖和当前最高版本的差异~~\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frni-l%2Fmulti-dependent-management","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Frni-l%2Fmulti-dependent-management","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frni-l%2Fmulti-dependent-management/lists"}