Node CLI 개발 위 챗 애플 릿 비계 구축 예시
목적.
현재 회사 의
TOC
제품 은 위 챗 애플 릿 이 고 업무 가 확 대 됨 에 따라 더 많은 수요 가 있 기 때문에 더 많은 애플 릿 을 만 들 수 있 습 니 다.팀 이 개발 하기 전에 공정 화 된 일부 설정 과 모든 프로젝트 의 일치 성 을 유지 하 는 데 많은 시간 을 들 이지 않도록Node CLI
위 챗 애플 릿 비 계 를 만 들 기로 결 정 했 습 니 다.작은 프로그램의 제3자 프레임 워 크 가 많 습 니 다.제 가 접촉 한 것 은
taro
/wepy
/mpvue
이 있 고 모두 온라인 에 대응 하 는 프로젝트 가 있 습 니 다.이러한 프레임 워 크 를 시도 하 는 과정 에서 네 이 티 브 애플 릿 과 비교 하여 공유 하고 싶 은 느낌 이 들 었 습 니 다.대체적인 사고 방식.
이 기능 은 상대 적 으로 매우 기본 적 인 것 이지 만 매일 벽돌 을 옮 기 는 업무 자로 서 어 려 운 과정 이자 좋 은 학습 기회 이다.
하기 전에 지역 사 회 를 찾 아 비교 하고 싶 습 니 다.ox:beer:의 학습(베 끼 기)을 한 번 하고 잠시 생각 한 후에 과감하게 선택
taro-cli
한 다음 에 소스 코드 를 신속하게 열 고 한 번 의 조작(완전 몽 그 라 미)을 배 운 후에 야 시작 합 니 다.이 구체 적 인 실현 방향 은 두 가지 생각 이 듭 니 다.
git clone
원 격 창 고 를 모델 로 다운로드 한 다음 에 사용자 의 입력 에 따라 설정 수정.json
파일(예 를 들 어appId
template
현재 디 렉 터 리 에 놓 고 바로'copy',그 후의 일 은 동일 하 다저울질 한 후에
lerna
을 관리 도구 로 사용 하려 고 합 니 다.그 중에서 모델 도 하나의npm
로 사용 할 때npm
다운로드 하 는 것 입 니 다.이렇게 하 는 것 은 제 가 관리 하기 편리 하고 통일push
/publish
을 위해 서 입 니 다.바로 편리 함 을 위해 서 입 니 다.smile:.최종 사고방식:
노출 명령->사용자 상호작용 입력 설정->집합 설정 다운로드 모드->설정 에 따라 수정
.json
->git init
+설치 의존Node CLI 개발
Lerna 프로젝트 구축
알 고 있 는
monorepo
친구 들 은 내 가 더 말 할 필요 가 없다.사실은 코드 를 한 창고 에 두 었 다.그 결과 가방 간 에 회상 한 후에 번 거 로 운 문 제 를 발표 했다.여기 서 우 리 는lerna
이 신기 로 우리 가 가방 의 통일 관 리 를 하 는 데 도움 을 주 었 다.
//
mkdir modoo-mini-program
cd modoo-mini-program
//
lerna init
cd packages
mkdir modoo-script
mkdir modoo-template-mini
mkdir modoo-mini // modoo-script ,
lerna bootstrap // + npm link
설치 의존기능 을 실현 하기 위해 서,우 리 는 약간의 의존 패 키 지 를 설치 해 야 한다.
우선 첫 번 째 단 계 는 사용자 가 전체적으로 설치 한 후에 명령 인 터 페 이 스 를 드 러 내 려 면
packages.json
파일 에 다음 과 같은 내용 을 추가 해 야 합 니 다.
"bin": {
"modoo-script": "./bin/modoo-script.js"
},
다음 루트 디 렉 터 리 에 폴 더 만 들 기bin
+bin/modoo-script.js
#!/usr/bin/env node
const { program } = require("commander");
program
.version(require("../package").version) // modoo-script --version
.usage("<command> [options]")
// init ,
.command("init [projectName]", "Init a project with default templete")
.parse(process.argv); //
그 다음 에 주의해 야 할 것 은commander
지원Git
스타일 의 하위 명령 처 리 는 하위 명령 에 따라 특정 형식 으로 명 명 된 명령 으로 파일 을 자동 으로 유도 할 수 있 습 니 다.파일 이름 의 형식 은[command]-[subcommand]
입 니 다.예 를 들 어:
modoo-script init => modoo-script-init
modoo-script build => modoo-script-build
따라서init
명령 을 실현 하기 위해bin
파일 디 렉 터 리 에 직접 추가 할 수 있 습 니 다modoo-script-init.js
#!/usr/bin/env node
const { program } = require("commander");
program
.option("--name [name]", " ")
.option("--description [description]", " ")
.option("--framework", " ")
.parse(process.argv);
const args = program.args;
//
const { name, description, framework } = program;
const projectName = args[0] || name;
......
사용자 상호작용명령 파 라 메 터 를 가 져 온 후 매개 변수 에 따라 사용자 인 터 랙 션 인터페이스 로 이동 합 니 다.여기 서 사용 하 는 것 은
inquirer
명령 행 인 터 랙 션 을 처리 하 는 것 입 니 다.사용 방법 은 간단 합 니 다.
const inquirer = require('inquirer')
if (typeof conf.description !== 'string') {
prompts.push({
type: 'input',
name: 'description',
message: ' !'
})
}
......
inquirer.prompt(prompts).then(answers => {
//
this.conf = Object.assign(this.conf, answers);
})
원 격 모듈여 기 는 비교적 괴롭다.처음에 말 했 듯 이 나 는 모델 을
npm
로 삼 았 다.구체 적 으로 찾 아 보면 다운로드 하 는 과정 은 다음 과 같다.npm search
해당 모델 찾기npm
tarball
tarball
하고 파일 설정부분 코드 는 그림 과 같다.
// npm search npm
const { execSync } = require("child_process");
module.exports = () => {
let list = [];
try {
const listJSON = execSync(
"npm search --json --registry http://registry.npmjs.org/ @modoo/modoo-template"
);
list = JSON.parse(listJSON);
} catch (error) {}
return Promise.resolve(list);
};
// npm
const pkg = require("package-json");
const chalk = require("chalk");
const logSymbols = require("log-symbols");
exports.getBoilerplateMeta = framework => {
log(
logSymbols.info,
chalk.cyan(` ${framework} , ...`)
);
return pkg(framework, {
fullMetadata: true
}).then(metadata => {
const {
dist: { tarball },
version,
name,
keywords
} = metadata;
log(
logSymbols.success,
chalk.green(` ${framework} , `)
);
return {
tarball,
version,
keywords,
name
};
});
};
// npm
const got = require("got");
const tar = require("tar");
const ora = require("ora");
const spinner = ora(
chalk.cyan(` ${framework} ...`)
).start();
const stream = await got.stream(tarball);
fs.mkdirSync(proPath);
const tarOpts = {
strip: 1,
C: proPath
};
//
stream.pipe(tar.x(tarOpts)).on("close", () => {
spinner.succeed(chalk.green(" !"));
......
})
//
const fs = require("fs-extra");
readFiles(
proPath,
{
ignore: [
".{pandora,git,idea,vscode,DS_Store}/**/*",
"{scripts,dist,node_modules}/**/*",
"**/*.{png,jpg,jpeg,gif,bmp,webp}"
],
gitignore: true
},
({ path, content }) => {
fs.createWriteStream(path).end(template(content, inject));
}
);
//
exports.readFiles = (dir, options, done) => {
if (!fs.existsSync(dir)) {
throw new Error(`The file ${dir} does not exist.`);
}
if (typeof options === "function") {
done = options;
options = {};
}
options = Object.assign(
{},
{
cwd: dir,
dot: true,
absolute: true,
onlyFiles: true
},
options
);
const files = globby.sync("**/**", options);
files.forEach(file => {
done({
path: file,
content: fs.readFileSync(file, { encoding: "utf8" })
});
});
};
//
exports.template = (content = "", inject) => {
return content.replace(/@{([^}]+)}/gi, (m, key) => {
return inject[key.trim()];
});
};
다운로드 의존다운로드 완료 및 설정 수정 후 기본 실행
.json
+환경git init
/yarn
/npm
설치 의존 에 따라 간단 합 니 다.
const { exec } = require("child_process");
const ora = require("ora");
const chalk = require("chalk");
// proPath
process.chdir(proPath);
// git init
const gitInitSpinner = ora(
`cd ${chalk.cyan.bold(projectName)}, ${chalk.cyan.bold("git init")}`
).start();
const gitInit = exec("git init");
gitInit.on("close", code => {
if (code === 0) {
gitInitSpinner.color = "green";
gitInitSpinner.succeed(gitInit.stdout.read());
} else {
gitInitSpinner.color = "red";
gitInitSpinner.fail(gitInit.stderr.read());
}
});
// install
let command = "";
if (shouldUseYarn()) {
command = "yarn";
} else if (shouldUseCnpm()) {
command = "cnpm install";
} else {
command = "npm install";
}
log(" ".padEnd(2, "
"));
const installSpinner = ora(
` ${chalk.cyan.bold(command)}, ...`
).start();
exec(command, (error, stdout, stderr) => {
if (error) {
installSpinner.color = "red";
installSpinner.fail(chalk.red(" , !"));
console.log(error);
} else {
installSpinner.color = "green";
installSpinner.succeed(" ");
log(`${stderr}${stdout}`);
}
});
주요 코드 는 바로 이런 것 입 니 다.사실은 생각 만 알 면 이런 것들 은 모두 간단 합 니 다.제 가 쓴 것 은 약간️:chicken:이지 만 주요 한 논 리 는 잘 정리 할 수 있 습 니 다.더 자세 한 것 은 갈 수 있 습 니 다:eyes:제 가 보 낸 소스 코드 입 니 다.가르쳐 주 셔 서 감사합니다.:pray::pray::pray:비 계 를 개발 하 다
이것 은 작은 프로그램의 비계 이기 때문에 다른
cnpm
프레임 처럼 많은web
설정 이 필요 하지 않 기 때문에 상대 적 으로 매우 간단 하 다.이 비계 에 대해 개발 자 도구 가 만 든 기본 항목 에 비해 저 는 이 비계 의 문제점 을 보완 하 였 습 니 다.
webpack
const gulp = require('gulp');
const chalk = require('chalk');
const rename = require('gulp-rename');
// less
gulp.task('less', () => {
return gulp
.src('./miniprogram/**/*.less')
.pipe(less())
.pipe(postcss()) // post.config.js
.pipe(
rename((path) => {
path.extname = '.wxss';
})
)
.pipe(
gulp.dest((file) => {
return file.base; //
})
);
});
// less
if (env === 'development') {
gulp.watch(['./miniprogram/**/*.less'], gulp.series('less')).on('change', (path) => {
log(chalk.greenBright(`File ${path} was changed`));
});
}
// , ,
const imagemin = require('gulp-imagemin');
const cache = require('gulp-cache'); //
gulp.task('miniimage', () => {
return gulp
.src('./miniprogram/**/*.{png,jpe?g,gif,svg}')
.pipe(
cache(
imagemin([
imagemin.gifsicle({ interlaced: true }),
imagemin.mozjpeg({ quality: 75, progressive: true }),
imagemin.optipng({ optimizationLevel: 5 }),
imagemin.svgo({
plugins: [{ removeViewBox: true }, { cleanupIDs: false }],
}),
])
)
)
.pipe(
gulp.dest((file) => {
return file.base; //
})
);
});
다른 구체 적 인 설정 은 제 것 을 볼 수 있 습 니 다GitHub 창고 원본 코드레 퍼 런 스
taro-cli
pandora-cli
little-bird-cli
Node CLI 를 개발 하여 위 챗 애플 릿 비 계 를 구축 하 는 예제 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 Node CLI 구축 애플 릿 비 계 를 구축 하 는 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 많은 지원 바 랍 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
NestJs Guard하지만 가드는 ExcutionContext를 사용할 수 있기 때문에 다음에 어떠한 라우트 핸들러가 실행되는지 정확하게 알 수 있다. ExecutionContext는 ArgumentsHost를 상속 받았기 때문에 각 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.