Commit 3e63c9ef authored by silver47gin's avatar silver47gin
Browse files

增加模板

parents
node_modules
.temp
\ No newline at end of file
registry=https://registry.npm.taobao.org
disturl=https://npm.taobao.org/dist
sass_binary_site=https://npm.taobao.org/mirrors/node-sass/
phantomjs_cdnurl=https://npm.taobao.org/mirrors/phantomjs/
electron_mirror=https://npm.taobao.org/mirrors/electron/
chromedriver_cdnurl=https://npm.taobao.org/mirrors/chromedriver
operadriver_cdnurl=https://npm.taobao.org/mirrors/operadriver
selenium_cdnurl=https://npm.taobao.org/mirrors/selenium
node_inspector_cdnurl=https://npm.taobao.org/mirrors/node-inspector
fsevents_binary_host_mirror=http://npm.taobao.org/mirrors/fsevents/
### 安装
- GitRepoURI 为项目的 git 代码仓库 URI
```bash
$ yarn global add ${GitRepoURI}
```
### 本地调试
```
$ yarn HelloWorld hello
```
### 开发
## 添加新命令
- 在 command 下添加新的 ts 文件,文件名和需要注册的命令名保持一致
- 命令需要默认导出函数 `(p:Command) => void`, 该函数在初始化时将被运行,可以在函数中注册命令
- Command 具体参数与使用,参考[commander](https://github.com/tj/commander.js)
- 基本代码如下:
```
import { Command } from "commander";
export default (program: Command) => {
program
.command("commandName")
.description("命令描述")
.action(async function () {
// dosomething
});
};
```
## 提交代码
- 重新构建代码
```
$ yarn build
```
- 打版本
```
$ yarn version
```
- 提交
#!/usr/bin/env node
require("../build/index.js");
{
"name": "HelloWorld",
"main": "index.js",
"license": "MIT",
"version": "2.0.0",
"scripts": {
"build": "tsc",
"HelloWorld": "ts-node src/index.ts"
},
"bin": {
"HelloWorld": "./bin/cli.js"
},
"devDependencies": {
"@types/node": "^16.11.7",
"tsconfig-paths": "^3.11.0"
},
"dependencies": {
"commander": "^8.3.0",
"dayjs": "^1.10.7",
"ts-node": "^10.4.0",
"typescript": "^4.4.4"
}
}
import { Command } from "commander";
import dayjs from "dayjs";
import { ConfigManager } from "../utils";
interface Config {
runTime: number;
times: number[];
}
export default (program: Command) => {
program
.command("hello")
.description("命令行运行测试")
.action(async function () {
const config = await ConfigManager.create<Config>("hello", {
runTime: 0,
times: [],
});
await config.setValues({
runTime: config.getValues().runTime + 1,
times: [...config.getValues().times, dayjs().valueOf()],
});
console.log(config.getValues());
return;
});
};
import commander from "commander";
import fs from "fs";
import path from "path";
const program = commander.program;
(async function () {
const commandsDirPath = path.join(__dirname, "command");
const commandFileNames = fs.readdirSync(commandsDirPath);
for (const commandFileName of commandFileNames) {
const commandFileAbsolutePath = path.join(commandsDirPath, commandFileName);
require(commandFileAbsolutePath).default(program);
}
await program.parseAsync(process.argv);
})();
import fs from "fs";
import os from "os";
import path from "path";
import { promisify } from "util";
import { logger } from "./logger";
const configDirName = ".HelloWorld";
/**
* 用来管理配置文件
* 方便按照模块存储配置文件到$HOMEDIR/${configDirName}文件夹中
*/
export class ConfigManager<T extends {}> {
module: string;
configDir: string;
configFile: string;
config: T;
defaultValue: T;
constructor(module: string, defaultValue: T) {
this.module = module;
this.defaultValue = defaultValue;
this.config = defaultValue;
this.configDir = path.join(os.homedir(), configDirName);
this.configFile = path.join(this.configDir, `${this.module}.json`);
}
static create = async <T extends {}>(module: string, defaultValue: T) => {
const c = new ConfigManager<T>(module, defaultValue);
await c.init();
return c;
};
init = async () => {
await this.sureConfig();
await this.load();
};
sureConfig = async () => {
try {
await promisify(fs.access)(this.configDir);
} catch (error) {
logger.log(`配置文件目录${this.configDir}不存在`);
logger.log(`创建目录`);
await promisify(fs.mkdir)(this.configDir, { recursive: true });
}
try {
await promisify(fs.access)(this.configFile);
} catch (error) {
logger.log(`配置文件${this.configFile}不存在`);
logger.log(`创建配置文件`);
await promisify(fs.writeFile)(
this.configFile,
JSON.stringify(this.defaultValue, null, 4),
{ flag: "w" }
);
}
};
load = async () => {
try {
this.config = JSON.parse(
(await promisify(fs.readFile)(this.configFile)).toString()
);
} catch (error) {
logger.log(`读取${this.module}配置文件失败`);
this.config = this.defaultValue;
}
};
save = async () => {
try {
await promisify(fs.writeFile)(
this.configFile,
JSON.stringify(this.config, null, 4),
{ flag: "w" }
);
} catch (error) {
logger.log(`写入${this.module}配置文件失败`);
}
};
setValue = async <K extends keyof T>(key: K, value: T[K]) => {
this.config[key] = value;
await this.save();
};
setValues = async (changes: Partial<T>) => {
this.config = { ...this.config, ...changes };
await this.save();
};
getValues = () => this.config;
}
export const mainConfigManager = new ConfigManager("main", {});
export * from "./config";
export * from "./logger";
export * from "./path";
export const logger = console;
import { readdir, stat } from "fs";
import { join } from "path";
import { promisify } from "util";
/**
* 此项目的根目录
*/
export const projectRoot = join(__dirname, "../../");
/**
* 遍历文件
* @param dir
* @param fileHandler
* @param dirHandler 不传值则默认遍历,传递的函数返回true会遍历,返回false则不继续遍历
*/
export const tarvel = async (
dir: string,
fileHandler?: (path: string) => Promise<void>,
dirHandler?: (path: string, next: () => Promise<void>) => Promise<void>
) => {
const children = await promisify(readdir)(dir);
for (const iterator of children) {
const p = join(dir, iterator);
const now = await promisify(stat)(p);
if (now.isDirectory()) {
const next = async () => await tarvel(p, fileHandler, dirHandler);
if (!!dirHandler) {
await Promise.resolve(dirHandler(p, next));
} else {
await next();
}
}
if (now.isFile()) {
await Promise.resolve(fileHandler?.(p));
}
}
};
module.exports = {
placeholderName: "HelloWorld",
templateDir: "./template"
}
\ No newline at end of file
{
// "ts-node": {
// "require": ["tsconfig-paths/register"]
// },
"compilerOptions": {
"target": "es2019",
"module": "CommonJS",
"allowSyntheticDefaultImports": true,
"esModuleInterop": true,
"resolveJsonModule": true,
"outDir": "build",
"strict": true,
"experimentalDecorators": true
}
}
# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
# yarn lockfile v1
"@cspotcode/source-map-consumer@0.8.0":
version "0.8.0"
resolved "https://registry.nlark.com/@cspotcode/source-map-consumer/download/@cspotcode/source-map-consumer-0.8.0.tgz#33bf4b7b39c178821606f669bbc447a6a629786b"
integrity sha1-M79LeznBeIIWBvZpu8RHpqYpeGs=
"@cspotcode/source-map-support@0.7.0":
version "0.7.0"
resolved "https://registry.npmmirror.com/@cspotcode/source-map-support/download/@cspotcode/source-map-support-0.7.0.tgz#4789840aa859e46d2f3173727ab707c66bf344f5"
integrity sha1-R4mECqhZ5G0vMXNyercHxmvzRPU=
dependencies:
"@cspotcode/source-map-consumer" "0.8.0"
"@tsconfig/node10@^1.0.7":
version "1.0.8"
resolved "https://registry.nlark.com/@tsconfig/node10/download/@tsconfig/node10-1.0.8.tgz#c1e4e80d6f964fbecb3359c43bd48b40f7cadad9"
integrity sha1-weToDW+WT77LM1nEO9SLQPfK2tk=
"@tsconfig/node12@^1.0.7":
version "1.0.9"
resolved "https://registry.nlark.com/@tsconfig/node12/download/@tsconfig/node12-1.0.9.tgz?cache=0&sync_timestamp=1624076051838&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40tsconfig%2Fnode12%2Fdownload%2F%40tsconfig%2Fnode12-1.0.9.tgz#62c1f6dee2ebd9aead80dc3afa56810e58e1a04c"
integrity sha1-YsH23uLr2a6tgNw6+laBDljhoEw=
"@tsconfig/node14@^1.0.0":
version "1.0.1"
resolved "https://registry.nlark.com/@tsconfig/node14/download/@tsconfig/node14-1.0.1.tgz?cache=0&sync_timestamp=1623230252928&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40tsconfig%2Fnode14%2Fdownload%2F%40tsconfig%2Fnode14-1.0.1.tgz#95f2d167ffb9b8d2068b0b235302fafd4df711f2"
integrity sha1-lfLRZ/+5uNIGiwsjUwL6/U33EfI=
"@tsconfig/node16@^1.0.2":
version "1.0.2"
resolved "https://registry.nlark.com/@tsconfig/node16/download/@tsconfig/node16-1.0.2.tgz#423c77877d0569db20e1fc80885ac4118314010e"
integrity sha1-Qjx3h30Fadsg4fyAiFrEEYMUAQ4=
"@types/json5@^0.0.29":
version "0.0.29"
resolved "https://registry.nlark.com/@types/json5/download/@types/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee"
integrity sha1-7ihweulOEdK4J7y+UnC86n8+ce4=
"@types/node@^16.11.7":
version "16.11.7"
resolved "https://registry.npmmirror.com/@types/node/download/@types/node-16.11.7.tgz?cache=0&sync_timestamp=1636407250305&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2F%40types%2Fnode%2Fdownload%2F%40types%2Fnode-16.11.7.tgz#36820945061326978c42a01e56b61cd223dfdc42"
integrity sha512-QB5D2sqfSjCmTuWcBWyJ+/44bcjO7VbjSbOE0ucoVbAsSNQc4Lt6QkgkVXkTDwkL4z/beecZNDvVX15D4P8Jbw==
acorn-walk@^8.1.1:
version "8.2.0"
resolved "https://registry.nlark.com/acorn-walk/download/acorn-walk-8.2.0.tgz?cache=0&sync_timestamp=1630916608758&other_urls=https%3A%2F%2Fregistry.nlark.com%2Facorn-walk%2Fdownload%2Facorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1"
integrity sha1-dBIQ8uJCZFRQiFOi9E0KuDt/acE=
acorn@^8.4.1:
version "8.5.0"
resolved "https://registry.nlark.com/acorn/download/acorn-8.5.0.tgz#4512ccb99b3698c752591e9bb4472e38ad43cee2"
integrity sha1-RRLMuZs2mMdSWR6btEcuOK1DzuI=
arg@^4.1.0:
version "4.1.3"
resolved "https://registry.nlark.com/arg/download/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089"
integrity sha1-Jp/HrVuOQstjyJbVZmAXJhwUQIk=
commander@^8.3.0:
version "8.3.0"
resolved "https://registry.npmmirror.com/commander/download/commander-8.3.0.tgz?cache=0&sync_timestamp=1634886396986&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fcommander%2Fdownload%2Fcommander-8.3.0.tgz#4837ea1b2da67b9c616a67afbb0fafee567bca66"
integrity sha1-SDfqGy2me5xhamevuw+v7lZ7ymY=
create-require@^1.1.0:
version "1.1.1"
resolved "https://registry.npm.taobao.org/create-require/download/create-require-1.1.1.tgz?cache=0&sync_timestamp=1606399137064&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcreate-require%2Fdownload%2Fcreate-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333"
integrity sha1-wdfo8eX2z8n/ZfnNNS03NIdWwzM=
dayjs@^1.10.7:
version "1.10.7"
resolved "https://registry.nlark.com/dayjs/download/dayjs-1.10.7.tgz?cache=0&sync_timestamp=1631266519235&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fdayjs%2Fdownload%2Fdayjs-1.10.7.tgz#2cf5f91add28116748440866a0a1d26f3a6ce468"
integrity sha1-LPX5Gt0oEWdIRAhmoKHSbzps5Gg=
diff@^4.0.1:
version "4.0.2"
resolved "https://registry.nlark.com/diff/download/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d"
integrity sha1-YPOuy4nV+uUgwRqhnvwruYKq3n0=
json5@^1.0.1:
version "1.0.1"
resolved "https://registry.npm.taobao.org/json5/download/json5-1.0.1.tgz?cache=0&sync_timestamp=1612146079519&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fjson5%2Fdownload%2Fjson5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe"
integrity sha1-d5+wAYYE+oVOrL9iUhgNg1Q+Pb4=
dependencies:
minimist "^1.2.0"
make-error@^1.1.1:
version "1.3.6"
resolved "https://registry.nlark.com/make-error/download/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2"
integrity sha1-LrLjfqm2fEiR9oShOUeZr0hM96I=
minimist@^1.2.0:
version "1.2.5"
resolved "https://registry.nlark.com/minimist/download/minimist-1.2.5.tgz?cache=0&sync_timestamp=1618847003091&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fminimist%2Fdownload%2Fminimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602"
integrity sha1-Z9ZgFLZqaoqqDAg8X9WN9OTpdgI=
strip-bom@^3.0.0:
version "3.0.0"
resolved "https://registry.nlark.com/strip-bom/download/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3"
integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=
ts-node@^10.4.0:
version "10.4.0"
resolved "https://registry.npmmirror.com/ts-node/download/ts-node-10.4.0.tgz#680f88945885f4e6cf450e7f0d6223dd404895f7"
integrity sha1-aA+IlFiF9ObPRQ5/DWIj3UBIlfc=
dependencies:
"@cspotcode/source-map-support" "0.7.0"
"@tsconfig/node10" "^1.0.7"
"@tsconfig/node12" "^1.0.7"
"@tsconfig/node14" "^1.0.0"
"@tsconfig/node16" "^1.0.2"
acorn "^8.4.1"
acorn-walk "^8.1.1"
arg "^4.1.0"
create-require "^1.1.0"
diff "^4.0.1"
make-error "^1.1.1"
yn "3.1.1"
tsconfig-paths@^3.11.0:
version "3.11.0"
resolved "https://registry.nlark.com/tsconfig-paths/download/tsconfig-paths-3.11.0.tgz?cache=0&sync_timestamp=1629839757813&other_urls=https%3A%2F%2Fregistry.nlark.com%2Ftsconfig-paths%2Fdownload%2Ftsconfig-paths-3.11.0.tgz#954c1fe973da6339c78e06b03ce2e48810b65f36"
integrity sha1-lUwf6XPaYznHjgawPOLkiBC2XzY=
dependencies:
"@types/json5" "^0.0.29"
json5 "^1.0.1"
minimist "^1.2.0"
strip-bom "^3.0.0"
typescript@^4.4.4:
version "4.5.2"
resolved "https://registry.npmmirror.com/typescript/download/typescript-4.5.2.tgz?cache=0&sync_timestamp=1637174199111&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Ftypescript%2Fdownload%2Ftypescript-4.5.2.tgz#8ac1fba9f52256fdb06fb89e4122fa6a346c2998"
integrity sha512-5BlMof9H1yGt0P8/WF+wPNw6GfctgGjXp5hkblpyT+8rkASSmkUKMXrxR0Xg8ThVCi/JnHQiKXeBaEwCeQwMFw==
yn@3.1.1:
version "3.1.1"
resolved "https://registry.nlark.com/yn/download/yn-3.1.1.tgz?cache=0&sync_timestamp=1628974764210&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fyn%2Fdownload%2Fyn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50"
integrity sha1-HodAGgnXZ8HV6rJqbkwYUYLS61A=
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment