手把手教你結合commitizen 搭建屬於本身的項目git 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"
    }
  });
}

步驟

1、建立工具項目

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.jsonscript中添加以下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 更智能(摸索中)
相關文章
相關標籤/搜索