UNPKG

3.46 kBJavaScriptView Raw
1#!/usr/bin/env node
2
3/**
4 * 命令行 deploy [action]
5 * 工具入口,主要是识别命令、收集、校验、整合配置给具体的执行者
6 * @param action: config | [scheme] | oss | version
7 * deploy config get/set 读取或设置全局的配置,有个坑就是重新安装npm包后,又会变成默认配置
8 * deploy [scheme]: 按照scheme方案部署
9 * deploy oss: 单纯上传资源到OSS
10 * deploy version: 查看版本号
11 */
12
13const path = require('path')
14const program = require('commander')
15const chalk = require('chalk')
16const {
17 checkNodeVersion,
18 cleanArgs,
19 info,
20 getPwd,
21 getSecret,
22 getProjectConfig,
23 paramChecker,
24} = require('../lib/util')
25
26// 检查node版本
27const requiredVersion = require('../package.json').engines.node
28checkNodeVersion(requiredVersion, '@ifun/deploy')
29
30// 获取全局配置
31const globalConfigPath = path.resolve(__dirname, '../config/config.global.json')
32
33delete require.cache[require.resolve(globalConfigPath)]
34
35const globalConfig = require(globalConfigPath)
36
37// 查看版本号
38program
39 .version(require('../package').version)
40 .usage('<action> [options]')
41
42// 读取或设置全局配置
43program
44 .command('config <action> [key] [value]')
45 .option('-a, --all', '是否读取全部配置')
46 .action((action, key, value, cmd) => {
47 const tempOptions = cleanArgs(cmd)
48
49 const options = {
50 ...tempOptions,
51 key,
52 value,
53 }
54
55 require(`../lib/${action}`)(options)
56 })
57
58// 按照部署方案进行部署
59program
60 .command('app <scheme>')
61 .option('-w, --web [web]', 'web服务器')
62 .option('-u, --user [user]', 'web服务器用户名')
63 .option('-d, --dir [dir]', '要部署到web服务器的目录')
64 .action(async (scheme, cmd) => {
65 // 只在deploy app | oss 命令下才去获取项目配置
66 const projectConfig = getProjectConfig(scheme)
67 const tempOptions = cleanArgs(cmd)
68
69 let { pwd } = projectConfig
70 pwd || (pwd = await getPwd())
71
72 /**
73 * 参数优先级:临时(命令行传入)参数 > 项目配置 > 默认配置
74 */
75 const options = {
76 ...globalConfig,
77 ...projectConfig,
78 ...tempOptions,
79 scheme,
80 pwd,
81 }
82
83 paramChecker(options)
84
85 require(`../lib/deploy`)(options)
86 })
87
88// 单独执行上传资源到OSS
89program
90 .command('oss <name>')
91 .option('-i, --accessKeyId <accessKeyId>', 'oss accessKeyId')
92 .option('-s, --accessKeySecret <accessKeySecret>', 'oss accessKeySecret')
93 .option('-p [publicDir]', '项目内要部署到OSS服务器的文件目录')
94 .option('-b [bucket]', 'oss服务器bucket')
95 .option('-r [region]', 'oss服务器region')
96 .option('-a [assets]', 'oss服务器上放置静态资源的目录')
97 .action(async (scheme, cmd) => {
98 // 只在deploy app | oss 命令下才去获取项目配置
99 const projectConfig = getProjectConfig(scheme)
100 const tempOptions = cleanArgs(cmd)
101 const accessKeySecret = await getSecret()
102
103 const options = {
104 ...globalConfig,
105 ...projectConfig,
106 ...tempOptions,
107 scheme,
108 accessKeySecret,
109 }
110
111 paramChecker(options)
112
113 require(`../lib/deploy-oss`)(options)
114 })
115
116// add some useful info on help
117program.on('--help', () => {
118 info(`\n Run ${chalk.cyan(`deploy <command> --help`)} for detailed usage of given command.\n`)
119})
120
121program.commands.forEach(c => c.on('--help', () => console.log()))
122
123program.parse(process.argv)
124
125process.on('SIGINT', () => {
126 process.exit(0)
127})