#!/usr/bin/env node "use strict"; const path = require('path'); const editJsonFile = require("edit-json-file"); const arg = process.argv // 初始化my-commit ,將部分腳本寫入到package.json中 if (arg[2] && arg[2] === 'init') { // If the file doesn't exist, the content will be an empty object by default. let file = editJsonFile(`${process.cwd()}/package.json`); // Set a couple of fields file.set("husky", {"hooks": { "pre-commit": "lint-staged" }}); file.set("lint-staged", { "src/*.js": "['eslint --fix']" }); // 詢問是否所有使用git add . var List = require('prompt-list'); var list = new List({ name: 'order', message: '是否默認使用git add .', // choices may be defined as an array or a function that returns an array choices: [ 'yes', 'no' ] }) // async list.ask(function(answer) { file.set("scripts", { "my-ci": answer === 'yes' ? 'git add . && cross-env ./node_modules/.bin/my-commit' : 'cross-env ./node_modules/.bin/my-commit' }); // Output the content file.save(); var shell = require('shelljs'); console.log('開始安裝依賴'); shell.exec('npm i husky --save-dev', {async: true}) console.log('正在安裝 husky---- '); shell.exec('npm i cross-env --save-dev', {async: true}) console.log('正在安裝cross-env ---- '); shell.exec('npm i lint-staged --save-dev', {async: true}) }) } else { const bootstrap = require('commitizen/dist/cli/git-cz').bootstrap; bootstrap({ cliPath: path.join(__dirname, '../../node_modules/commitizen'), // this is new config: { "path": "cz-conventional-changelog", "path": "cz-emoji" } }); }
1.使用git/gitlab建立一個空的倉庫
2.在空倉庫中添加
index.js
內容以下
// index.js #!/usr/bin/env node "use strict"; const bootstrap = require('commitizen/dist/cli/git-cz').bootstrap; bootstrap({ cliPath: path.join(__dirname, '../../node_modules/commitizen'), // this is new config: { "path": "cz-conventional-changelog" } });
my-commit
)1.先發布你的工具項目到npm,至關於建立一個npm包、具體怎麼發佈 這裏不作贅述,網上不少教程
2.安裝工具(假設插件名稱
my-commit
)
npm install my-commit --save-dev
3.配置
須要在package.json
的script
中添加以下node
// my-ci 是本身定義的寫成什麼均可以 "my-ci": "./node_modules/.bin/my-commit"
4.配置以後 執行了git add .
以後 執行npm run my-ci
將會出現選填補充信息的選項
若是以爲git add.
以後再執行 npm run my-ci
有點麻煩,能夠直接改爲git
// my-ci 是本身定義的寫成什麼均可以 "my-ci": "git add. && ./node_modules/.bin/my-commit"
5 由於以上命令存在不一樣系統路徑不兼容問題 須要加入
cross-env
npm install cross-env --save-dev
6 再次修改
package.json
// my-ci 是本身定義的寫成什麼均可以 "my-ci": "git add. && cross-env ./node_modules/.bin/my-commit"
當須要提交代碼的時候,不用執行git add .
直接執行npm run my-ci
便可shell
7 提示信息加上可愛的表情
須要在index.js
文件中添加 cz-emoji
以下npm
// index.js #!/usr/bin/env node "use strict"; const bootstrap = require('commitizen/dist/cli/git-cz').bootstrap; bootstrap({ cliPath: path.join(__dirname, '../../node_modules/commitizen'), // this is new config: { "path": "cz-conventional-changelog", "path": "cz-emoji" } });
這個時候 從新發npm包以後再安裝到本身的項目下,執行提交的時候json
8 爲了加強校驗功能,加入
eslint
對文件進行
這個有點複雜,須要經過lint-staged
來判斷bootstrap
因此先安裝如下依賴async
npm i husky --save-dev npm i lint-stage --save-dev
配置package.json
工具
// 增長屬性 "husky": { "hooks": { "pre-commit": "lint-staged" } }, "lint-staged": { "src/*.js": [ "eslint --fix" ] }, // 其中src的具體路徑是能夠本身配置 // 校驗規則是基於當前目錄的.eslintrc.js 文件,若是有些規則不想要,就配置這個文件
這個時候咱們提交代碼的時候再輸入基本的信息以後會執行一個eslint的代碼規則 gitlab
總結以上配置文件 咱們須要 ui
安裝的庫有
npm i my-commit --save-dev npm i cross --save-dev npm i husky --save-dev npm i lint-stage --save-dev
須要配置package.json屬性有
"script": { ... "my-ci": "git add. && cross-env ./node_modules/.bin/my-commit" }, "husky": { "hooks": { "pre-commit": "lint-staged" } }, "lint-staged": { "src/*.js": [ "eslint --fix" ] },
若是每一個項目都這麼玩。其實有點耗時間,因此咱們作了一下自動化
10 初步自動化
修改my-commit中的 index.js
#!/usr/bin/env node "use strict"; const path = require('path'); const editJsonFile = require("edit-json-file"); const arg = process.argv // 初始化my-commit ,將部分腳本寫入到package.json中 if (arg[2] && arg[2] === 'init') { // If the file doesn't exist, the content will be an empty object by default. let file = editJsonFile(`${process.cwd()}/package.json`); // Set a couple of fields file.set("husky", {"hooks": { "pre-commit": "lint-staged" }}); file.set("lint-staged", { "src/*.js": "['eslint --fix']" }); // 詢問是否所有使用git add . var List = require('prompt-list'); var list = new List({ name: 'order', message: '是否默認使用git add .', // choices may be defined as an array or a function that returns an array choices: [ 'yes', 'no' ] }) // async list.ask(function(answer) { file.set("scripts", { "my-ci": answer === 'yes' ? 'git add . && cross-env ./node_modules/.bin/my-commit' : 'cross-env ./node_modules/.bin/my-commit' }); // Output the content file.save(); var shell = require('shelljs'); console.log('開始安裝依賴'); shell.exec('npm i husky --save-dev', {async: true}) console.log('正在安裝 husky---- '); shell.exec('npm i cross-env --save-dev', {async: true}) console.log('正在安裝cross-env ---- '); shell.exec('npm i lint-staged --save-dev', {async: true}) }) } else { const bootstrap = require('commitizen/dist/cli/git-cz').bootstrap; bootstrap({ cliPath: path.join(__dirname, '../../node_modules/commitizen'), // this is new config: { "path": "cz-conventional-changelog", "path": "cz-emoji" } }); }
清除掉之前配置的package.json
只要兩部安裝便可
npm i my-commit npx my-commit init
提交代碼的時候直接執行 npm run my-ci
便可
11 更智能(摸索中)