cli支持了update操作

This commit is contained in:
Xu Chang 2022-04-22 16:52:15 +08:00
commit 7435b20e3c
8 changed files with 165 additions and 103 deletions

3
lib/create.d.ts vendored
View File

@ -1 +1,2 @@
export default function create(dirName: string, env: string): Promise<void>;
export declare function create(dirName: string, cmd: any): Promise<void>;
export declare function update(dirName: string, subDirName: string, cmd: any): Promise<void>;

View File

@ -3,6 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.update = exports.create = void 0;
const file_handle_1 = require("./file-handle");
const enum_1 = require("./enum");
const config_1 = require("./config");
@ -29,13 +30,15 @@ const prompt = [
* @name 检查项目名是否已存在
* @param dirName
*/
function checkProjectName(dirName) {
function checkProjectName(dirName, exists) {
// 项目根路径
const rootPath = process.cwd() + '/' + dirName;
const isExists = (0, file_handle_1.checkFileExists)(rootPath);
if (isExists) {
console.error((0, tip_style_1.error)(`Cannot create a project named ${(0, tip_style_1.success)(`"${dirName}"`)} because a path with the same name exists.\n`) + (0, tip_style_1.error)('Please choose a different project name.'));
process.exit(1);
if (isExists && !exists) {
throw new global.Error(`Cannot create a project named ${(0, tip_style_1.success)(`"${dirName}"`)} because a path with the same name exists.\nPlease choose a different project name.`);
}
else if (!isExists && exists) {
throw new global.Error(`${(0, tip_style_1.success)(dirName)} is not a valid project dir.\nPlease choose a different project name.`);
}
}
/**
@ -58,7 +61,28 @@ async function getMiniVersion() {
});
return versionsSort[0]['sdkVer'];
}
async function create(dirName, env) {
async function createWechatMpBoilplate(dir, isDev, isUpdate) {
// 获取微信小程序稳定基础版本库
const miniVersion = await getMiniVersion();
// 获取小程序项目app.json内容
const appJsonWithWeChatMp = (0, template_1.appJsonContentWithWeChatMp)(isDev);
// 获取小程序项目project.config.json内容
const projectConfigWithWeChatMp = (0, template_1.projectConfigContentWithWeChatMp)(config_1.USER_CONFIG_FILE_NAME, 'wechatMp', miniVersion);
// 获取小程序项目oak.config.json内容
const oakConfigWithWeChatMp = (0, template_1.oakConfigContentWithWeChatMp)();
const appJsonPathWithWeChatMp = (0, path_1.join)(dir, 'src', 'app.json');
// 小程序项目project.config.json路径
const projectConfigPathWithWeChatMp = (0, path_1.join)(dir, 'src', 'project.config.json');
// 小程序项目project.config.json路径
const oakConfigPathWithWeChatMp = (0, path_1.join)(dir, 'src', config_1.USER_CONFIG_FILE_NAME);
// 创建小程序项目project.config.json
(0, file_handle_1.checkFileExistsAndCreate)(projectConfigPathWithWeChatMp, projectConfigWithWeChatMp, enum_1.checkFileExistsAndCreateType.FILE, isUpdate);
// 创建小程序项目app.json
(0, file_handle_1.checkFileExistsAndCreate)(appJsonPathWithWeChatMp, appJsonWithWeChatMp, enum_1.checkFileExistsAndCreateType.FILE, isUpdate);
// 创建小程序项目oak.config.json
(0, file_handle_1.checkFileExistsAndCreate)(oakConfigPathWithWeChatMp, oakConfigWithWeChatMp, enum_1.checkFileExistsAndCreateType.FILE, isUpdate);
}
async function create(dirName, cmd) {
const nameOption = {
type: 'input',
name: 'name',
@ -66,10 +90,8 @@ async function create(dirName, env) {
default: dirName,
};
prompt.unshift(nameOption);
const isDev = env === 'dev' || env === 'development';
const isDev = cmd.dev ? true : false;
const { name, version, description } = await inquirer_1.default.prompt(prompt);
// 获取微信小程序稳定基础版本库
const miniVersion = await getMiniVersion();
// 获取package.json内容
const packageJson = (0, template_1.packageJsonContent)({
name,
@ -81,12 +103,6 @@ async function create(dirName, env) {
});
// 获取tsconfig.json内容
const tsconfigJson = (0, template_1.tsConfigJsonContent)();
// 获取小程序项目app.json内容
const appJsonWithWeChatMp = (0, template_1.appJsonContentWithWeChatMp)(isDev);
// 获取小程序项目project.config.json内容
const projectConfigWithWeChatMp = (0, template_1.projectConfigContentWithWeChatMp)(config_1.USER_CONFIG_FILE_NAME, 'wechatMp', miniVersion);
// 获取小程序项目oak.config.json内容
const oakConfigWithWeChatMp = (0, template_1.oakConfigContentWithWeChatMp)();
// 项目根路径
const rootPath = process.cwd() + '/' + dirName;
// package.json路径
@ -97,13 +113,8 @@ async function create(dirName, env) {
const webRootPath = `${rootPath}/web`;
// 小程序项目根路径
const weChatMpRootPath = `${rootPath}/wechatMp`;
const appJsonPathWithWeChatMp = `${weChatMpRootPath}/src/app.json`;
// 小程序项目project.config.json路径
const projectConfigPathWithWeChatMp = `${weChatMpRootPath}/src/project.config.json`;
// 小程序项目project.config.json路径
const oakConfigPathWithWeChatMp = `${weChatMpRootPath}/src/${config_1.USER_CONFIG_FILE_NAME}`;
// 被复制的文件夹路径
const currentPath = (0, path_1.join)(__dirname, '..') + '/template';
const currentPath = (0, path_1.join)(__dirname, '..', 'template');
//检查项目名是否存在
checkProjectName(dirName);
try {
@ -115,12 +126,7 @@ async function create(dirName, env) {
(0, file_handle_1.checkFileExistsAndCreate)(tsconfigJsonPath, tsconfigJson, enum_1.checkFileExistsAndCreateType.FILE);
// 复制项目文件
(0, file_handle_1.copyFolder)(currentPath, rootPath);
// 创建小程序项目project.config.json
(0, file_handle_1.checkFileExistsAndCreate)(projectConfigPathWithWeChatMp, projectConfigWithWeChatMp, enum_1.checkFileExistsAndCreateType.FILE);
// 创建小程序项目app.json
(0, file_handle_1.checkFileExistsAndCreate)(appJsonPathWithWeChatMp, appJsonWithWeChatMp, enum_1.checkFileExistsAndCreateType.FILE);
// 创建小程序项目oak.config.json
(0, file_handle_1.checkFileExistsAndCreate)(oakConfigPathWithWeChatMp, oakConfigWithWeChatMp, enum_1.checkFileExistsAndCreateType.FILE);
await createWechatMpBoilplate(weChatMpRootPath, isDev);
if (!shelljs_1.default.which('npm')) {
(0, tip_style_1.Warn)((0, tip_style_1.warn)('Sorry, this script requires npm! Please install npm!'));
shelljs_1.default.exit(1);
@ -144,4 +150,31 @@ async function create(dirName, env) {
(0, tip_style_1.Error)((0, tip_style_1.error)(err));
}
}
exports.default = create;
exports.create = create;
async function update(dirName, subDirName, cmd) {
const isDev = cmd.dev ? true : false;
try {
// 需要拷贝的路径
const destPath = (0, path_1.join)(process.cwd(), dirName, subDirName);
const templatePath = (0, path_1.join)(__dirname, '..', 'template');
//检查项目名是否存在
checkProjectName(dirName, true);
if (subDirName === 'src') {
const fromPath = (0, path_1.join)(templatePath, subDirName);
(0, file_handle_1.copyFolder)(fromPath, destPath, true);
}
else if (subDirName.startsWith('wechatMp')) {
const fromPath = (0, path_1.join)(templatePath, 'wechatMp');
(0, file_handle_1.copyFolder)(fromPath, destPath, true);
await createWechatMpBoilplate(destPath, isDev, true);
}
else {
throw new global.Error(`Cannot recoganize ${(0, tip_style_1.success)(`"${subDirName}"`)} for update.\n Please choose src/wechatMp%.`);
}
(0, tip_style_1.Success)(`${(0, tip_style_1.success)(`Successfully update directory ${(0, tip_style_1.primary)(subDirName)} for project ${(0, tip_style_1.primary)(dirName)}}`)}`);
}
catch (err) {
console.error((0, tip_style_1.error)(err.message));
}
}
exports.update = update;

View File

@ -45,7 +45,7 @@ export declare function readFile(path: string | PathLike, options?: {
* @param {PathLike} currentDir
* @param {PathLike} targetDir
*/
export declare function copyFolder(currentDir: PathLike, targetDir: PathLike): void;
export declare function copyFolder(currentDir: PathLike, targetDir: PathLike, overwrite?: boolean): void;
/**
* @name /
* @export
@ -60,4 +60,4 @@ export declare function checkFileExists(path: PathLike | string): boolean;
* @param {*} [data]
* @param {checkFileExistsAndCreateType} [type=checkFileExistsAndCreateType.DIRECTORY]
*/
export declare function checkFileExistsAndCreate(path: PathLike | string, data?: any, type?: checkFileExistsAndCreateType): void;
export declare function checkFileExistsAndCreate(path: PathLike | string, data?: any, type?: checkFileExistsAndCreateType, overwrite?: boolean): void;

View File

@ -126,7 +126,7 @@ exports.readFile = readFile;
* @param {PathLike} currentDir
* @param {PathLike} targetDir
*/
function copyFolder(currentDir, targetDir) {
function copyFolder(currentDir, targetDir, overwrite) {
function handleFolder(currentDir, targetDir) {
const files = (0, fs_1.readdirSync)(currentDir, {
withFileTypes: true
@ -138,7 +138,13 @@ function copyFolder(currentDir, targetDir) {
// 判断文件是否存在
const readCurrentFile = (0, fs_1.existsSync)(copyCurrentFileInfo);
const readTargetFile = (0, fs_1.existsSync)(copyTargetFileInfo);
if (readCurrentFile && !readTargetFile) {
if (!readCurrentFile) {
throw new global.Error(`操作失败,待拷贝的源路径${copyCurrentFileInfo}不存在`);
}
else if (file.isFile() && readTargetFile && !overwrite) {
throw new global.Error(`操作失败,待拷贝的目标文件${copyTargetFileInfo}已经存在`);
}
else {
// 判断是否为文件,如果为文件则复制,文件夹则递归
if (file.isFile()) {
const readStream = (0, fs_1.createReadStream)(copyCurrentFileInfo);
@ -148,16 +154,14 @@ function copyFolder(currentDir, targetDir) {
else {
try {
(0, fs_1.accessSync)((0, path_1.join)(copyTargetFileInfo, '..'), fs_1.constants.W_OK);
copyFolder(copyCurrentFileInfo, copyTargetFileInfo);
copyFolder(copyCurrentFileInfo, copyTargetFileInfo, overwrite);
}
catch (error) {
(0, tip_style_1.Warn)('权限不足' + error);
throw error;
}
}
}
else {
(0, tip_style_1.Error)((0, tip_style_1.error)('操作失败target文件夹已存在或current文件夹不存在'));
}
}
}
if ((0, fs_1.existsSync)(currentDir)) {
@ -167,7 +171,7 @@ function copyFolder(currentDir, targetDir) {
handleFolder(currentDir, targetDir);
}
else {
(0, tip_style_1.Warn)((0, tip_style_1.warn)('需要copy的文件夹不存在:' + currentDir));
throw new global.Error('需要copy的文件夹不存在:' + currentDir);
}
}
exports.copyFolder = copyFolder;
@ -188,8 +192,8 @@ exports.checkFileExists = checkFileExists;
* @param {*} [data]
* @param {checkFileExistsAndCreateType} [type=checkFileExistsAndCreateType.DIRECTORY]
*/
function checkFileExistsAndCreate(path, data, type = enum_1.checkFileExistsAndCreateType.DIRECTORY) {
if (!checkFileExists(path)) {
function checkFileExistsAndCreate(path, data, type = enum_1.checkFileExistsAndCreateType.DIRECTORY, overwrite) {
if (!checkFileExists(path) || overwrite) {
switch (type) {
case enum_1.checkFileExistsAndCreateType.DIRECTORY:
(0, fs_1.mkdirSync)(path);
@ -202,5 +206,8 @@ function checkFileExistsAndCreate(path, data, type = enum_1.checkFileExistsAndCr
break;
}
}
else {
throw new global.Error(`${path} already exists!`);
}
}
exports.checkFileExistsAndCreate = checkFileExistsAndCreate;

View File

@ -5,7 +5,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
};
Object.defineProperty(exports, "__esModule", { value: true });
const commander_1 = __importDefault(require("commander"));
const create_1 = __importDefault(require("./create"));
const create_1 = require("./create");
const build_1 = __importDefault(require("./build"));
const make_1 = __importDefault(require("./make"));
const config_1 = require("./config");
@ -56,11 +56,17 @@ commander_1.default
.description('build we chat mp of build on demand')
.action(build_1.default);
commander_1.default
.command('create <name> [env]')
.command('create <name>')
.usage('<name>')
// .option('-e, --env <env>', 'A env')
.option('-d, --dev', 'dev')
.description(`create a new project powered by ${config_1.CLI_NAME}`)
.action(create_1.default);
.action(create_1.create);
commander_1.default
.command('update <name> [subDirName]')
.usage('<name>')
.option('-d, --dev', 'dev')
.description(`update project's template powered by ${config_1.CLI_NAME}`)
.action(create_1.update);
// output help information on unknown commands
commander_1.default.arguments('<command>').action((cmd) => {
commander_1.default.outputHelp();

View File

@ -57,24 +57,12 @@ function checkProjectName(dirName: string, exists?: true) {
const rootPath = process.cwd() + '/' + dirName;
const isExists = checkFileExists(rootPath);
if (isExists && !exists) {
console.error(
error(
`Cannot create a project named ${success(
throw new global.Error(`Cannot create a project named ${success(
`"${dirName}"`
)} because a path with the same name exists.\n`
) + error('Please choose a different project name.')
);
process.exit(-1);
)} because a path with the same name exists.\nPlease choose a different project name.`);
}
else if (!isExists && exists) {
console.error(
error(
`${success(
`"${dirName}"`
)} is not a valid project dir.\n`
) + error('Please choose a different project name.')
);
process.exit(-1);
throw new global.Error(`${success(dirName)} is not a valid project dir.\nPlease choose a different project name.`)
}
}
@ -101,7 +89,7 @@ async function getMiniVersion() {
}
async function createWechatMpBoilplate(dir: string, isDev: boolean) {
async function createWechatMpBoilplate(dir: string, isDev: boolean, isUpdate?: boolean) {
// 获取微信小程序稳定基础版本库
const miniVersion = await getMiniVersion();
// 获取小程序项目app.json内容
@ -115,7 +103,6 @@ async function createWechatMpBoilplate(dir: string, isDev: boolean) {
// 获取小程序项目oak.config.json内容
const oakConfigWithWeChatMp = oakConfigContentWithWeChatMp();
const appJsonPathWithWeChatMp = join(dir, 'src', 'app.json');
// 小程序项目project.config.json路径
@ -126,23 +113,26 @@ async function createWechatMpBoilplate(dir: string, isDev: boolean) {
checkFileExistsAndCreate(
projectConfigPathWithWeChatMp,
projectConfigWithWeChatMp,
checkFileExistsAndCreateType.FILE
checkFileExistsAndCreateType.FILE,
isUpdate
);
// 创建小程序项目app.json
checkFileExistsAndCreate(
appJsonPathWithWeChatMp,
appJsonWithWeChatMp,
checkFileExistsAndCreateType.FILE
checkFileExistsAndCreateType.FILE,
isUpdate
);
// 创建小程序项目oak.config.json
checkFileExistsAndCreate(
oakConfigPathWithWeChatMp,
oakConfigWithWeChatMp,
checkFileExistsAndCreateType.FILE
checkFileExistsAndCreateType.FILE,
isUpdate
);
}
export async function create(dirName: string, env: string) {
export async function create(dirName: string, cmd: any) {
const nameOption = {
type: 'input',
name: 'name',
@ -150,8 +140,7 @@ export async function create(dirName: string, env: string) {
default: dirName,
};
prompt.unshift(nameOption);
const isDev = env === 'dev' || env === 'development';
const isDev = cmd.dev ? true : false;
const { name, version, description }: PromptInput = await inquirer.prompt(
prompt
@ -235,10 +224,10 @@ export async function create(dirName: string, env: string) {
}
export async function update(dirName: string, subDirName: string, env: string) {
console.log(dirName, subDirName, env);
/* const isDev = env === 'dev' || env === 'development';
export async function update(dirName: string, subDirName: string, cmd: any) {
const isDev = cmd.dev ? true : false;
try {
// 需要拷贝的路径
const destPath = join(process.cwd(), dirName, subDirName);
@ -248,11 +237,28 @@ export async function update(dirName: string, subDirName: string, env: string) {
if (subDirName === 'src') {
const fromPath = join(templatePath, subDirName);
copyFolder(fromPath, destPath);
copyFolder(fromPath, destPath, true);
}
else if (subDirName.startsWith('wechatMp')) {
const fromPath = join(templatePath, 'wechatMp');
copyFolder(fromPath, destPath);
copyFolder(fromPath, destPath, true);
await createWechatMpBoilplate(destPath, isDev, true);
}
else {
throw new global.Error(`Cannot recoganize ${success(
`"${subDirName}"`
)} for update.\n Please choose src/wechatMp%.`);
}
Success(
`${success(
`Successfully update directory ${primary(subDirName)} for project ${primary(dirName)}}`
)}`
);
}
catch (err) {
console.error(error((err as Error).message));
}
} */
}

View File

@ -119,7 +119,7 @@ export function readFile(
* @param {PathLike} currentDir
* @param {PathLike} targetDir
*/
export function copyFolder(currentDir: PathLike, targetDir: PathLike) {
export function copyFolder(currentDir: PathLike, targetDir: PathLike, overwrite?: boolean) {
function handleFolder(currentDir: PathLike, targetDir: PathLike) {
const files = readdirSync(currentDir, {
@ -127,29 +127,34 @@ export function copyFolder(currentDir: PathLike, targetDir: PathLike) {
})
for (let file of files) {
// 拼接文件绝对路径
const copyCurrentFileInfo = currentDir + '/' + file.name
const copyTargetFileInfo = targetDir + '/' + file.name
const copyCurrentFileInfo = currentDir + '/' + file.name;
const copyTargetFileInfo = targetDir + '/' + file.name;
// 判断文件是否存在
const readCurrentFile = existsSync(copyCurrentFileInfo)
const readTargetFile = existsSync(copyTargetFileInfo)
if (readCurrentFile && !readTargetFile) {
const readCurrentFile = existsSync(copyCurrentFileInfo);
const readTargetFile = existsSync(copyTargetFileInfo);
if (!readCurrentFile) {
throw new global.Error(`操作失败,待拷贝的源路径${copyCurrentFileInfo}不存在`);
}
else if (file.isFile() && readTargetFile && !overwrite) {
throw new global.Error(`操作失败,待拷贝的目标文件${copyTargetFileInfo}已经存在`);
}
else {
// 判断是否为文件,如果为文件则复制,文件夹则递归
if (file.isFile()) {
const readStream = createReadStream(copyCurrentFileInfo)
const writeStream = createWriteStream(copyTargetFileInfo)
readStream.pipe(writeStream)
const readStream = createReadStream(copyCurrentFileInfo);
const writeStream = createWriteStream(copyTargetFileInfo);
readStream.pipe(writeStream);
} else {
try {
accessSync(join(copyTargetFileInfo, '..'), constants.W_OK)
copyFolder(copyCurrentFileInfo, copyTargetFileInfo)
accessSync(join(copyTargetFileInfo, '..'), constants.W_OK);
copyFolder(copyCurrentFileInfo, copyTargetFileInfo, overwrite);
} catch (error) {
Warn('权限不足' + error)
Warn('权限不足' + error);
throw error;
}
}
} else {
Error(error('操作失败target文件夹已存在或current文件夹不存在'))
}
}
}
@ -159,7 +164,7 @@ export function copyFolder(currentDir: PathLike, targetDir: PathLike) {
}
handleFolder(currentDir, targetDir)
} else {
Warn(warn('需要copy的文件夹不存在:' + currentDir))
throw new global.Error('需要copy的文件夹不存在:' + currentDir);
}
}
@ -180,8 +185,8 @@ export function checkFileExists(path: PathLike | string) {
* @param {*} [data]
* @param {checkFileExistsAndCreateType} [type=checkFileExistsAndCreateType.DIRECTORY]
*/
export function checkFileExistsAndCreate(path: PathLike | string, data?: any, type: checkFileExistsAndCreateType = checkFileExistsAndCreateType.DIRECTORY): void {
if (!checkFileExists(path)) {
export function checkFileExistsAndCreate(path: PathLike | string, data?: any, type: checkFileExistsAndCreateType = checkFileExistsAndCreateType.DIRECTORY, overwrite?: boolean): void {
if (!checkFileExists(path) || overwrite) {
switch (type) {
case checkFileExistsAndCreateType.DIRECTORY:
mkdirSync(path)
@ -194,4 +199,7 @@ export function checkFileExistsAndCreate(path: PathLike | string, data?: any, ty
break;
}
}
else {
throw new global.Error(`${path} already exists!`);
}
}

View File

@ -58,14 +58,15 @@ program
.description('build we chat mp of build on demand')
.action(build);
program
.command('create <name> [env]')
.command('create <name>')
.usage('<name>')
// .option('-e, --env <env>', 'A env')
.option('-d, --dev', 'dev')
.description(`create a new project powered by ${CLI_NAME}`)
.action(create);
program
.command('update <name> [subDirName]')
.usage('<name>')
.option('-d, --dev', 'dev')
.description(`update project's template powered by ${CLI_NAME}`)
.action(update);
// output help information on unknown commands