当前位置: 首页 > 工具软件 > gulp-pack > 使用案例 >

基于gulp自动化打包流程

赵献
2023-12-01

背景:

为什么要搞自动化呢?因为项目上测试环境的时候,频繁打包,有时候如果bug等级高的话,就算是改一处代码也要打包一版,打完包把svn上原来的项目删除,再把新的包上传到svn,这个步骤太繁琐了,如果项目大的话,打包的时间还长,等的很焦急啊,我这么懒的一个人,少等一下是一下,能少写一行代码绝不多写一行,so看到同事用,自己也去学习了一下,之前一直觉得可能比较难,可是写完之后真的就是炒鸡简单又好用呀,所以写个博客记录一下喽~~~~~~

预备知识:

  1. gulp的基本用法(em,对的,基本用法就够了)

    (1)作为项目的开发依赖安装

    $ npm install --save-dev gulp
    复制代码

    (2)在项目的根目录下创建一个名为***gulpfile.js***的文件,必须是这个名,不然项目中识别不了这个gulp文件哦~

    var gulp = require('gulp');
    gulp.task('default', function() {
        // 将你的默认的任务代码放在这
    });
    复制代码

    (3)运行gulp

    $ gulp
    复制代码
  2. SVN常用命令(从svn上删除,再push进去,svn delete和svn import足够了)

    (1)删除文件

     svn delete path -m “delete test fle“
    复制代码

    (2)import 到 svn

     svn import -m "import test" 引入文件路径 目标svn路径 --username(后面加上登陆svn名字) --password(后面加上登陆svn密码)  
    复制代码

ok,那让我们一起来看代码吧!!!

package.json

  {
   "scripts":{
  	"buildSvn": "gulp clean && npm run build && npm run push",
  	"push": "bash build.sh"
    }
  }
复制代码

先让我们看一下package.json里面执行什么命令吧,其实就一个命令buildSvn, 它执行的顺序分别是:

  1. gulp clean⇒删除根目录下已有的dist文件夹

  2. npm run build⇒执行了vue-cli项目自带的打包命令打包各个文件

  3. npm run push⇒执行bash build.sh文件

gulpfile.js

const gulp = require('gulp')
const del = require('del')
const zip = require('gulp-zip')
const minimist = require('minimist')
function nowDate() { // 获取当前时间****年**月**日**时**分
  const date = new Date()
  const year = `${date.getFullYear()}年`
  const month = `${format(date.getMonth() + 1)}月`
  const day = `${format(date.getDate())}日`
  const hour = `${format(date.getHours())}时`
  const minute = `${format(date.getMinutes())}分`
  return `${year}${month}${day}${hour}${minute}`
}
function format(s) { // 如果1月变成01月(格式转换)
  if (String(s).length < 2) {
    return `0${s}`
  }
  return s
}
gulp.task('clean', async () => { // 删除根目录下已有的dist文件夹
  await del(['./dist/**/*'])
})
const zipOptions = { // 设置默认起名为`dist${nowDate()}.zip`
  string: 'name',
}
 const options = minimist(process.argv.slice(2), zipOptions) // 解析命令行
gulp.task('zip', () => gulp.src('dist/**/*') // 打包哪个文件呢?打包的文件路径
		.pipe(zip(options.name || `./dist/dist${nowDate()}.zip`)) // 打包出来的文件名,如果用户输入了则用输入的,否则新建dist${nowDate()}.zip文件
		.pipe(gulp.dest('./'))) // 放在./dist下面
复制代码

引入的文件

const del = require('del') ⇒其实在这里可用可不用,不用的话可以用node自带删除文件模块,它的功能是支持多个文件的删除以及可以匹配正则表达式,比如说某个文件夹有要删除的文件和不想要删除的文件的时候,它就发挥作用了,eg:

var gulp = require('gulp');
var del = require('del');

gulp.task('clean:mobile', function (cb) {
  del([
    'dist/report.csv',
    // 这里我们使用一个通配模式来匹配 `mobile` 文件夹中的所有东西
    'dist/mobile/**/*',
    // 我们不希望删掉这个文件,所以我们取反这个匹配模式
    '!dist/mobile/deploy.json'
  ], cb);
});
gulp.task('default', ['clean:mobile']);
复制代码

const zip = require('gulp-zip') ⇒打包压缩文件

const minimist = require('minimist') ⇒轻量级的命令行参数解析引擎,eg:

// test.js
// var args = require('minimist')(process.argv.slice(2));
// console.log(args.hello);

var args = require('minimist')(process.argv.slice(2), {
    string: ["hello"]
});
console.log(args.hello);

// $ node test.js --hello=world
// world
// $ node test.js --hello world
// world
// $ node test.js --hello
// true 注意:不是空字符串而是true
$ node test.js --hello world
// world
$ node test.js --hello
// ""
复制代码

build.sh

#!/bin/sh // 使用sh解释器来解释shell脚本
svnpath=http://   svn上传路径
svnusername=   登录名
svnpassword=    登录密码
svn delete ${svnpath}/index.html ${svnpath}/static -m "删除文件" --username ${svnusername} --password ${svnpassword}
svn import -m "打包" ./dist ${svnpath} --username ${svnusername} --password ${svnpassword}
复制代码

#!/bin/sh 和 #!/bin/bash的区别是什么呢?对于脚本的实际运行有什么影响呢?

// test.sh

#!/bin/sh
source pcy.sh //(#pcy.sh并不存在)
echo hello

// 执行./test.sh
// 输出为 source不执行,后面的代码也执行不了,程序停止了,不会打印hello
// ./test.sh: line 2: pcy.sh: No such file or directory

// test.sh

#!/bin/bash
source pcy.sh //(#pcy.sh并不存在)
echo hello

// 执行./test.sh
// ./test.sh: line 2: pcy.sh: No such file or directory hello
// source不执行,但是打印hello
// 执行sh ./test.sh
// 输出为 source不执行,后面的代码也执行不了,程序停止了,不会打印hello
// ./test.sh: line 2: pcy.sh: No such file or directory
复制代码

所以为什么会有这个区别呢?

1.sh一般设成bash的软链[work@zjm-testing-app46 cy]$ ll /bin/shlrwxrwxrwx 1 root root 4 Nov 13 2006 /bin/sh -> bash

2.在一般的linux系统当中(如redhat),使用sh调用执行脚本相当于打开了bash的POSIX标准模式3. 也就是说 /bin/sh 相当于 /bin/bash --posix所以,sh跟bash的区别,实际上就是bash有没有开启posix模式的区别。

so~~~是不是很简单呢~~~大家一起愉快的“懒”起来吧!!!

转载于:https://juejin.im/post/5ca5c085e51d4564eb78d63a

 类似资料: