UNPKG

@wbi/cli-service

Version:

local service for wb-cli projects

124 lines (111 loc) 3.73 kB
/** * Created by jerry.lin-wun on 2019/2/7. * 打包文件,可将其发布到服务器 */ process.env.NODE_ENV = 'production' const path = require('path') const rm = require('rimraf') const chalk = require('chalk') const webpack = require('webpack') const inquirer = require('inquirer') const { FtpUpload, ftpRunSequence } = require('ftp-upload') const utils = require('./utils') const wbConfig = utils.wbConfig const cp = require('child_process') // 运行编译 const runCompiler = publicPath => { return new Promise(resolve => { // 删除.tmp文件夹 rm.sync(utils.resolve('./.tmp')) const webpackConfig = require('./webpack.prod.config')({ publicPath, // 所有任务都执行完毕之后,上传ftp文件 endCallback: resolve }) console.log('Building for production...\n') rm(webpackConfig.output.path, err => { if (err) throw err webpack(webpackConfig, function (err, stats) { if (err) throw err process.stdout.write(stats.toString({ assets: false, colors: true, modules: false, children: false, chunks: false, chunkModules: false }) + '\n') if (stats.hasErrors()) { console.log(chalk.red(' Build failed with errors.\n')) process.exit(1) } console.log('') }) }) }) } module.exports = function () { // 判断上传到测试环境还是正式环境 const env = wbConfig.private.sitePath.currentSite.siteEnv const ftpInfo = wbConfig.private.ftp const run = () => { // 实例化每个ftp上传任务 const ftpUploadHtml = new FtpUpload(ftpInfo[0]) const ftpUploadStatic = new FtpUpload(ftpInfo[1]) let testLink = '' // 按照顺序依次执行ftp上传任务 ftpRunSequence([ftpUploadHtml, ftpUploadStatic], ftpUpload => { // 初始化,得到需要上传的远程目录res.remoteDestPath ftpUpload.init().on('ready', function (res) { // 是否使用webpack编译 if (ftpUpload.opts.compiler) { let publicPath = null // 检查打包的publicPath不是以http开头时,则以远程目录res.remoteDestPath作为publicPath if (wbConfig.publicPath.build.substring(0, 4) !== 'http') { publicPath = path.posix.join(res.remoteDestPath, '/') } runCompiler(publicPath).then(() => { // 编译完成之后开始上传文件 ftpUpload.start(res.remoteDestPath) }) } else { // 跳过webpack编译,直接上传文件 ftpUpload.start(res.remoteDestPath) } }) }) ftpUploadHtml.on('success', res => { testLink = res.url }) ftpUploadStatic.on('success', res => { if (wbConfig.private.updateTestLink) { const siteName = require(utils.resolve('./package')).name // 开启构建测试连接清单子进程 cp.fork(utils.resolve('../sitemap/server/app.js'), [siteName, testLink]) } }) } if (!ftpInfo && env === 'production') { console.log( `找不到ftp配置信息,您可能无权发布到正式环境。\n` + `请前往${chalk.yellow.bold('componentServer/sitePath/sites.js')}将环境变量${chalk.yellow.bold('siteEnv')}改成${chalk.yellow.bold('\'development\'')}\n` + `再尝试发布到测试环境。` ) process.exit(1) } if (env === 'production') { inquirer.prompt([ { type: 'confirm', message: '警告:您将要打包文件到正式环境,是否继续?', name: 'ok' } ]).then(answers => { if (answers.ok) { run() } }) } else { run() } }