将CSScomb集成到Git Hook中

简介: 将CSScomb集成到Git Hook中

前言


在此前文章介绍了如何在微信小程序中使用 CSScomb 来处理我们的小程序样式文件。

但是此前实现有个不足的地方:没有实现在提交代码之前去执行我们的脚步命令。


正文


一、设想


假设我们可以在 pre-commit 阶段做一些类似 ESLint、Prettier 的操作,岂不美哉!


例如,如下配置文件是利用 husky、lint-staged 做了一些处理,在代码 commit 之前对代码进行检查和格式化。

{
  "husky": {
    "hooks": {
      "pre-commit": "lint-staged"
    }
  },
  "lint-staged": {
    "*.{js}": "eslint --fix --ext .js",
    "*.{css,wxss,acss}": "prettier --config .prettierrc.js --write"
  }
}


那我们使用 CSScomb 也想这么做的话,要怎样实现呢?


二、试图实现


关于前一篇文章的具体思路就不再赘述了


  1. 首先安装 husky、lint-staged。

# 这里我不安装最新版 husky 的原因是 husky 5.x 在使用上有很大变化
# 我暂时还没时间去了解它,所以先用着已经习惯的 4.x 版本,问题不大
$ yarn add --dev husky@4.3.8 lint-staged


  1. package.json 添加配置,如下:

{
  "scripts": {
    "csscomb": "gulp wxssTask",
    "csscomb:mini": "gulp csscombTask --path './**/*.wxss'"
  },
  "husky": {
    "hooks": {
      "pre-commit": "lint-staged"
    }
  },
  "lint-staged": {
    "*.wxss": "gulp csscombTask"
  }
}


  1. 接着,我们尝试去修改一个样式文件,并提交代码。

frankie@iMac csscomb-mini %  git commit -m 'test'
husky > pre-commit (node v14.16.0)
✔ Preparing...
⚠ Running tasks...
  ❯ Running tasks for *.wxss
    ✖ gulp csscombTask [FAILED]
↓ Skipped because of errors from tasks. [SKIPPED]
✔ Reverting to original state because of errors...
✔ Cleaning up...
✖ gulp csscombTask:
[14:30:14] Task never defined: /Users/frankie/Desktop/Web/Git/csscomb-mini/app.wxss
[14:30:14] To list available tasks, try running: gulp --tasks
[14:30:14] Using gulpfile ~/Desktop/Web/Git/csscomb-mini/gulpfile.js
husky > pre-commit hook failed (add --no-verify to bypass)


非常的遗憾,它失败了,并提示:Task never defined: /Users/frankie/Desktop/Web/Git/csscomb-mini/app.wxss

执行如下命令,明明是找得到 csscombTask 任务的啊!

frankie@iMac csscomb-mini %  npx gulp --tasks
[14:35:09] Tasks for ~/Desktop/Web/Git/csscomb-mini/gulpfile.js
[14:35:09] ├── wxssTask
[14:35:09] └── csscombTask


为什么会这样呢?什么原因呢?这也是我的踩坑的地方。


三、寻找失败原因


首先,我先翻阅了 lint-staged 的文档 ,里面有一段话:

{
  "*": "your-cmd"
}


This config will execute your-cmd with the list of currently staged files passed as arguments.

So, considering you did git add file1.ext file2.ext, lint-staged will run the following command: your-cmd file1.ext file2.ext.

假设我们暂存的文件是 /Users/frankie/Desktop/Web/Git/csscomb-mini/app.wxss,那么我们执行:

{
  "*.wxss": "gulp csscombTask"
}


就等于执行了 gulp csscombTask /Users/frankie/Desktop/Web/Git/csscomb-mini/app.wxss 这条指令。

但如果熟悉 Gulp 的话,形式如:gulp <task> <othertask> 其实是执行了多个任务。 所以,上面实际上执行了两个任务 csscombTask/Users/frankie/Desktop/Web/Git/csscomb-mini/app.wxss,它把后者也当成是一个任务了。


那么我们来验证一下,添加一个 Gulp 任务:

const test = cb => {
  // 需要注意的是:
  // 由于 node 特性,非主进程下执行该命令,无法将 test log 打印出来,
  // 例如在 lint-staged 下执行该 gulp 任务,就无法打印,
  // 如果通过 npx gulp xxx 执行任务,属于主进程,就能打印出来。
  console.log('test log')
  cb()
}
module.exports = {
  csscombTask,
  '/Users/frankie/Desktop/Web/Git/csscomb-mini/app.wxss': test
}


接着重新提交一下代码:

frankie@iMac csscomb-mini %  git commit -m 'test'
husky > pre-commit (node v14.16.0)
✔ Preparing...
✔ Running tasks...
✔ Applying modifications...
✔ Cleaning up...
[master a2ba057] test
 1 file changed, 3 insertions(+), 3 deletions(-)


它成功了,说明我们的猜想是正确的。

既然找到了缘由,那么我们开始着手解决问题吧。


四、解决问题


其实 /Users/frankie/Desktop/Web/Git/csscomb-mini/app.wxss 应该是我们 Gulp 任务的参数才对。

按照此前的约定:

gulp csscombTask --path '<filepath>' --ext <extension>


所以只要我们执行的命令形式如:gulp csscombTask --path '/Users/frankie/Desktop/Web/Git/csscomb-mini/app.wxss' 即可。

我们来修改一下 lint-staged 的配置文件,此前在 package.json 的配置方式局限性太大了,下面我们使用 JavaScript 形式的配置方式:

Writing the configuration file in JavaScript is the mo

st powerful way to configure lint-staged (lint-staged.config.js, similar, or passed via --config).


其实 lint-staged 提供了很多的配置示例,我们使用 Example: Wrap filenames in single quotes and run once per file 即可。


移除 package.json 的配置项,并在项目根目录下,新建 .lintstagedrc.js 配置文件:

// .lintstagedrc.js
module.exports = {
  '*.wxss': filenames => filenames.map(filename => `gulp csscombTask --path ${filename}`)
}
// 其实这里可配置的方式很多,
// 例如:超过 10 个暂存文件时,我们可以在整个项目下执行一遍 csscombTask 操作:
// module.exports = {
//   '*.wxss': filenames => {
//     if (filenames.length > 10) {
//       return 'gulp csscombTask --path './**/*.wxss''
//     }
//     return `gulp csscombTask --path '${filenames.join(',')'}`
//   }
// }


接下来我们修改两个样式文件,再提交一下:

frankie@iMac csscomb-mini % 🐶 git commit -m 'test'
husky > pre-commit (node v14.16.0)
✔ Preparing...
✔ Running tasks...
✔ Applying modifications...
✔ Cleaning up...
[master 7b84b9c] test
 2 files changed, 7 insertions(+), 3 deletions(-)


可以正常运行,而且我们所提交的文件都经过了 CSScomb 格式化了,


The end.

目录
相关文章
|
8月前
|
开发工具 数据安全/隐私保护 git
Git切换本地用户名,IDEA集成Git如何切换本地用户名
Git切换本地用户名,IDEA集成Git如何切换本地用户名
113 3
|
8月前
|
测试技术 持续交付 开发工具
《Git 简易速速上手小册》第6章:Git 在持续集成/持续部署(CI/CD)中的应用(2024 最新版)
《Git 简易速速上手小册》第6章:Git 在持续集成/持续部署(CI/CD)中的应用(2024 最新版)
133 2
|
6天前
|
jenkins 持续交付 开发工具
git hook
Hook 机制 用于拦截、修改或扩展程序的行为。通过 Hook 机制,程序可以在不修改源代码或核心逻辑的情况下,向特定的事件、函数调用之前或之后插入自定义代码。Hook 机制通常被用于调试、监控、拦截系统调用、修改程序的行为等场景。
98 65
git hook
|
3月前
|
前端开发 开发工具 git
如何清理 docker 磁盘空间+修改 Gitea 服务器的 Webhook 设置+前端一些好学好用的代码规范-git hook+husky + commitlint
如何清理 docker 磁盘空间+修改 Gitea 服务器的 Webhook 设置+前端一些好学好用的代码规范-git hook+husky + commitlint
48 5
|
3月前
|
Java Shell 开发工具
git集成IDEA,托管项目实现版本管理
git集成IDEA,托管项目实现版本管理
40 0
|
3月前
|
前端开发 开发工具 git
搭建Registry&Harbor私有仓库、Dockerfile(八)+前端一些好学好用的代码规范-git hook+husky + commitlint
搭建Registry&Harbor私有仓库、Dockerfile(八)+前端一些好学好用的代码规范-git hook+husky + commitlint
27 0
|
4月前
|
Shell 网络安全 开发工具
Git,GitHub,Gitee&IDEA集成Git
Git提交项目到GitHub简洁版、版本控制、安装、常用命令、分支、团队协作机制、Github、Gitee远程仓库、IDEA集成Git、IDEA集成Github、IDEA集成Gitee
|
5月前
|
jenkins 持续交付 开发工具
"引爆效率革命!Docker+Jenkins+GIT+Tomcat:解锁持续集成魔法,一键部署Java Web应用的梦幻之旅!"
【8月更文挑战第9天】随着软件开发复杂度的增加,自动化变得至关重要。本文通过实例展示如何结合Docker、Jenkins、Git与Tomcat建立高效的持续集成(CI)流程。Docker确保应用环境一致性;Jenkins自动化处理构建、测试和部署;Git管理源代码版本;Tomcat部署Web应用。在Jenkins中配置Git插件并设置项目,集成Docker构建Tomcat应用镜像并运行容器。此外,通过自动化测试、代码质量检查、环境隔离和日志监控确保CI流程顺畅,从而显著提高开发效率和软件质量。
95 3
|
5月前
|
jenkins 持续交付 开发工具
自动化开发之旅:Docker携手Jenkins,与Git和Tomcat共舞持续集成
【8月更文挑战第13天】在软件开发中,持续集成(CI)通过自动化构建、测试与部署提升效率与稳定性。Docker、Jenkins、Git和Tomcat构成CI的黄金组合:`git push`触发Jenkins作业,利用Docker确保环境一致性,最终将应用部署至Tomcat。首先配置Git Webhooks以触发Jenkins;接着在Jenkins中创建作业并使用Docker插件模拟真实环境;通过Maven构建项目;最后部署至Tomcat。这套流程减少人为错误,提高开发效率,展示了技术的力量与流程的革新。
103 0
|
8月前
|
安全 Shell 网络安全
Git学习---Git快速入门、Git基础使用、Git进阶使用、Git服务器使用(IDEA集成GitHub、Gitee、GitLab)、GitHub Desktop客户端
Git学习---Git快速入门、Git基础使用、Git进阶使用、Git服务器使用(IDEA集成GitHub、Gitee、GitLab)、GitHub Desktop客户端
218 0

相关实验场景

更多
下一篇
开通oss服务