{"id":15308025,"url":"https://github.com/wscats/lerna-tutorial","last_synced_at":"2025-04-14T23:13:50.311Z","repository":{"id":169808131,"uuid":"467788529","full_name":"Wscats/lerna-tutorial","owner":"Wscats","description":"💈Some of the lerna tutorial - 《Lerna学习笔记》","archived":false,"fork":false,"pushed_at":"2022-03-09T08:47:57.000Z","size":115,"stargazers_count":43,"open_issues_count":0,"forks_count":0,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-04-14T23:13:40.711Z","etag":null,"topics":["lerna","tutorial"],"latest_commit_sha":null,"homepage":"","language":"JavaScript","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/Wscats.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null}},"created_at":"2022-03-09T05:23:02.000Z","updated_at":"2025-02-23T08:24:00.000Z","dependencies_parsed_at":"2024-02-15T21:52:32.588Z","dependency_job_id":null,"html_url":"https://github.com/Wscats/lerna-tutorial","commit_stats":null,"previous_names":["wscats/lerna-tutorial"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Wscats%2Flerna-tutorial","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Wscats%2Flerna-tutorial/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Wscats%2Flerna-tutorial/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Wscats%2Flerna-tutorial/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Wscats","download_url":"https://codeload.github.com/Wscats/lerna-tutorial/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248975329,"owners_count":21192210,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","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":["lerna","tutorial"],"created_at":"2024-10-01T08:13:34.258Z","updated_at":"2025-04-14T23:13:50.293Z","avatar_url":"https://github.com/Wscats.png","language":"JavaScript","readme":"# Lerna\n\n是一个用来优化托管在 git/npm 上的多 package 代码库的工作流的一个管理工具，可以让你在主项目下管理多个子项目，从而解决了多个包互相依赖，且发布时需要手动维护多个包的问题。\n\n# 基本结构\n\n可以见到项目里面有多个 package.json，这些子项目的 package.json 全部由 lerna.json 管理起来\n\n```js\nlerna-project/\n    |-- packages/\n        |-- packages-a/\n            |-- ...\n            |-- package.json\n        |-- packages-b/\n            |-- ...\n            |-- package.json\n    |-- ...\n    |-- lerna.json\n    |-- package.json\n```\n\n# 父项目构建\n\n全局安装 lerna 命令\n\n```bash\nnpm i -g lerna\n```\n\n将仓库转变为一个 lerna 仓库\n\n```bash\nlerna init\n```\n\n# 子项目构建\n\n增加 2 个 packages\n\n```bash\nlerna create @eno/view\nlerna create @eno/utils\n```\n\n# 父项目增加依赖\n\n```bash\nnpm i chalk\n```\n\n# 子项目增加依赖\n\n我们可以使用 lerna，分别给相应的 package 增加依赖模块，就不需要手动在子项目里面一个一个的安装\n\n```bash\nlerna add chalk\n```\n\n以前我们在根目录下 npm i 完之后，只会安装好依赖生成 node_modules 在根目录，有了 lerna 之后可以配合子项目的 package.json 统一管理子项目下的所有依赖 node_modules 的安装和删除\n\n以前需要删除一个个子项目的依赖，现在只需要 lerna clean 一个命令即可\n\n| 命令  | 描述                                                            |\n| ----- | --------------------------------------------------------------- |\n| lerna | bootstrap 安装依赖                                              |\n| lerna | clean 删除各个包下的 node_modules                               |\n| lerna | init 创建新的 lerna 库                                          |\n| lerna | list 显示 package 列表                                          |\n| lerna | changed 显示自上次 relase tag 以来有修改的包， 选项通 list      |\n| lerna | diff 显示自上次 relase tag 以来有修改的包的差异， 执行 git diff |\n| lerna | exec 在每个包目录下执行任意命令                                 |\n| lerna | run 执行每个包 package.json 中的脚本命令                        |\n| lerna | add 添加一个包的版本为各个包的依赖                              |\n| lerna | import 引入 package                                             |\n| lerna | link 链接互相引用的库                                           |\n| lerna | create 新建 package                                             |\n| lerna | publish 发布                                                    |\n\n# 开发\n\n以后别人拿到项目之后，只需要运行以下命令就可以把整个项目的依赖安装好\n\n```bash\n# 安装父/根项目依赖\nnpm i\n# 安装子项目依赖\nlerna bootstrap\n```\n\n# pnpm 代替\n\n上面这种方式还能用 pnpm 的方案代替\n\n先在项目根目录建立一个 pnpm 的 workspcae 配置文件 pnpm-workspace.yaml，意味着这是一个 monorepo：\n\n```js\npackages:\n  # 所有在 packages/ 和 components/ 子目录下的 package\n  - 'packages/**'\n  - 'components/**'\n  # 不包括在 test 文件夹下的 package\n  - '!**/test/**'\n```\n\n然后直接在根目录 pnpm i 就可以代替原来的 npm i + lerna bootstrap\n\n# 参考文章\n\n- [Monorepo 項目管理方案：lerna + yarn workspace / pnpm](https://icode9.com/content-4-1180398.html)","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwscats%2Flerna-tutorial","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fwscats%2Flerna-tutorial","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwscats%2Flerna-tutorial/lists"}