@wbi/cli-service
Version:
local service for wb-cli projects
124 lines (111 loc) • 3.73 kB
JavaScript
/**
* 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()
}
}