打包文件复制脚本

||版本||更细时间||更新内容||
|| v1.0|| 2020.7.27||上传脚本 ||
|| v1.1|| 2020.7.30||修复build.js报错问题 ||
|| v1.2|| 2020.7.31||修复development环境下执行复制指令的问题 ||

出于安全考虑,目前代码仓库和部署仓库是分开的。部署时需要手动将打包的文件复制到部署文件夹,可添加打包文件复制脚本减少操作:

  • 插件方式:运行打包指令即可
  • 添加指令方式:需运行打包指令,且等待打包完成,运行打包复制文件指令
  1. 以用户中心代码为例:package.json 添加指令:
"scripts": {
	"copy:staging": "node build.js staging user-center",
	"copy:pro": "node build.js pro user-center"
}

或安装webpack-hooks-shellscripts插件并修改vue.config.js配置:

-----------------------------------------------------------------------------------------
npm install webpack-hooks-shellscripts --save-dev
-----------------------------------------------------------------------------------------
plugins: [
      // Ignore all locale files of moment.js
      new webpack.IgnorePlugin(/^\.\/locale$/, /moment$/),
      hooksScriptPlugin({
   	    afterEmit: process.env.VUE_APP_OUTPUT_DIR ? [
            `node build.js ${process.env.VUE_APP_OUTPUT_DIR} user-center`
          ] : []
    })
 ]
-----------------------------------------------------------------------------------------


  1. 新建与package.json同级文件build.js,代码如下:
const fs = require('fs')

/**
 * 拷贝文件(源文件和目标文件在同一级目录)
 * @param {*} src 源文件地址
 * @param {*} dist 目标文件地址
 * @param {*} firstDir 是否一级目录
 */
function copyDir (src, dist, firstDir = true) {
  fs.access(dist, function (err) {
    if (err) {
      // 目录不存在时创建目录
      fs.mkdirSync(dist)
    }
    _copy(null, src, dist)
  })

  function _copy (err, src, dist) {
    if (err) {
      throw new Error(err)
    } else {
      fs.readdir(src, function (err, paths) {
        if (err) {     
          throw new Error(err)
        } else {
          let lastestFile = ''
          let lastestDate = ''
          // 找最新创建的文件夹
          paths.forEach(function (path) {
            const _src = src + '/' + path
            var stat = fs.statSync(_src)
            const createTime = new Date(stat.ctime).getTime()
            if (!stat.isFile() && firstDir) {
              if (createTime > lastestDate) {
                lastestDate = createTime
                lastestFile = path
              }
            }
          })
          // 复制文件
          paths.forEach(function (path) {
            if (firstDir && path !== lastestFile) {
              return
            }
            const _src = src + '/' + path
            const _dist = dist + '/' + (firstDir && path === lastestFile ? '' : path)
            if (firstDir) {
              console.log('======================== copy file ========================')
              console.log('soure fileName: ', _src)
              console.log('target fileName: ', _dist)
              console.log('======================== copy file ========================')
            }
            fs.stat(_src, function (err, stat) {
              if (err) {        
		          throw new Error(err)
              } else {
                // 判断是文件还是目录
                if (stat.isFile()) {
                  fs.writeFileSync(_dist, fs.readFileSync(_src))
                } else if (stat.isDirectory()) {
                  // 当是目录是,递归复制
                  copyDir(_src, _dist, false)
                }
              }
            })
          })
        }
      })
    }
  }
}

const env = process.argv[2]
const dir = `../${process.argv[3]}`
if (!env || !dir) {
  throw new Error('请添加配置参数')
}
copyDir(`./dist/${env}`, `../${dir}`)

若安装插件最后一行代码改为

copyDir(`./dist/${env}`, `./${dir}`)
  1. 打包完后,执行指令(若安装插件,直接打包即可)
npm run copy:staging
npm run copy:pro
posted @ 2021-10-28 14:13  hjswlqd  阅读(121)  评论(0编辑  收藏  举报