咱们公司目前开发的项目是使用 Vue 搭建的后台管理应用.
随着同质的项目慢慢的变多, 原先维护在一个项目里的组件在其余项目也会用到, 而组件会随着业务的要求, 进行相应的升级和修改. 这就致使修改一个组件须要同步代码到其余项目. 因此很是须要一个组件仓库
的存在, 将本身的通用组件和通用的业务组件统一放在一个地方, 在各个项目经过 npm
的方式去进行版本管理.css
搜寻了一些解决方案, 咱们团队把方案定在了使用 Coding.net 提供的服务
+ Lerna
来实现咱们的组件仓库的搭建.html
先说说 Coding.vue
为何咱们不选择租用服务器, 搭建私有的 npm 仓库呢. 主要由于(界面好看)集成了咱们须要的全部服务, 包括(但不限于)代码托管/制品库/方便权限管理/比较好的交互体验/私有库/免费?.node
关于付费问题, 官网的价格策略是说 5 人如下团队免费, 我想能够知足不少小团队的需求了. 可是免费用户只能建立 20 个项目, 对于有不少组件的项目, 若是代码都要托管, 那确定不够, 因此就有了 Lerna
的登场, 把全部组件整合在一个项目里面, 还能独立发布组件.ios
步骤:git
npm config get registry
=> registry.npmjs.org/yarn config get registry
=> registry.yarnpkg.comnpm config set registry=(你的制品库地址)
npm whoami
npm login
登陆刚刚建立的用户使用访问令牌生成配置
(推荐使用)这里就省略了Lerna
的介绍了, 网络上能够查的到github
Lerna 的经常使用命令:npm
lerna init #初始化 lerna bootstrap #下载依赖包或者生成本地软链接 lerna add axios #全部包都添加axios lerna add packageB --scope=packageA # 添加依赖 / packageA 生成了node_modules,而node_modules里生成了指向 packageB 的软链,相似npm link的效果 lerna publish lerna list lerna clean 复制代码
本身的项目中lerna.json
的配置element-ui
{ "packages": [ "packages/*" // 要发布的包的路径 ], "command": { "publish": { "ignoreChanges": [ "ignored-file", "*.md", // 咱们团队的约定: 更新说明文档不算为组件更新 "package.json" // 每次更新版本后都会致使修改版本号的这个文件变成未提交, 因此排除 ] } }, "version": "independent" // 包独立发布 } 复制代码
到此, 咱们建立新的组件或者更新组件就能够这样作:json
lerna publish
根据须要修改版本好就能够把本身的组件发布到 Coding 的制品库了
在目标的项目下面:
npm i 目标包名 --registry=制品库地址(若是已经全局配置就能够省略)
这里还有一个问题就是组件的调试问题.
方法一: 使用 npm link
把包关联到目标项目来调试 方法二: 在项目里面添加一个测试的环境
项目的目录及说明以下:
├─ packages // 组件源文件
| ├─ CSelect
| | ├─ components // 子组件
| | ├─ package.json // 组件描述文件
| | ├─ index.js // 组件入口
| | ├─ c-select.vue
| | └─ README.md // 文档
├─ public
| ├─ index.html
| └─ favicon.ico
├─ src // 测试项目源文件
| ├─ assets
| | └─ logo.png
| ├─ components
| | ├─ CodeEditor // 使用了一个所见即所得的代码编辑器, 使得项目部署后方便调试不一样的参数
| | | ├─ index.js
| | | └─ CodeEditor.vue
| ├─ router
| | └─ index.js
| ├─ styles
| | ├─ index.scss
| | └─ element-ui.scss
| ├─ utils
| | ├─ index.js
| | └─ api.js
| ├─ views
| | ├─ examples
| | | ├─ c-select
| | | | ├─ index.vue
| | | | └─ code.js
| | └─ Home.vue
| ├─ main.js
| └─ App.vue
├─ vue.config.js
├─ package.json
├─ lerna.json
├─ babel.config.js
├─ README.md
├─ .npmrc
├─ .gitignore
├─ .eslintrc.js
├─ .browserslistrc
└─ .DS_Store
复制代码
大家的团队是否也须要一个组件仓库, 若是没有其余方案, 这个方案能够尝试下, 祝你能愉快的玩耍 (手动滑稽~)