create-dage-backend-cli 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. #!/usr/bin/env node
  2. const { program } = require("commander");
  3. const fs = require("fs");
  4. const path = require("path");
  5. const clc = require("cli-color");
  6. const { promisify } = require("util");
  7. const cliProgress = require("cli-progress");
  8. const ncp = promisify(require("ncp").ncp);
  9. const { exec, execSync } = require("child_process");
  10. const pkg = require("./package.json");
  11. process.stdout.setEncoding("utf8");
  12. program
  13. .version(pkg.version)
  14. .arguments("<projectName>")
  15. .action(async (projectName) => {
  16. const projectDir = path.join(process.cwd(), projectName);
  17. if (fs.existsSync(projectDir)) {
  18. console.log(clc.red("当前目录下已存在" + projectName));
  19. return;
  20. }
  21. fs.mkdirSync(projectDir);
  22. const templateDir = path.join(__dirname, "template");
  23. const exclusions = ["node_modules", "pnpm-lock.yaml"];
  24. const files = await promisify(fs.readdir)(templateDir);
  25. const progressBar = new cliProgress.SingleBar({
  26. format: "Progress [{bar}] {percentage}% | {value}/{total}",
  27. barCompleteChar: "\u001b[42m \u001b[0m",
  28. barIncompleteChar: "\u001b[40m \u001b[0m",
  29. hideCursor: true,
  30. });
  31. progressBar.start(files.length, 0);
  32. for (const file of files) {
  33. if (!exclusions.includes(file)) {
  34. const srcPath = path.join(templateDir, file);
  35. const destPath = path.join(projectDir, file);
  36. await ncp(srcPath, destPath);
  37. if (file === "package.json") {
  38. const packageJsonPath = path.join(destPath);
  39. const packageJson = JSON.parse(
  40. fs.readFileSync(packageJsonPath, "utf8")
  41. );
  42. packageJson.name = projectName;
  43. packageJson.version = pkg.version;
  44. packageJson.dependencies["@dage/pc-components"] =
  45. "^" + getPackageVersion("@dage/pc-components");
  46. packageJson.dependencies["@dage/utils"] =
  47. "^" + getPackageVersion("@dage/utils");
  48. fs.writeFileSync(
  49. packageJsonPath,
  50. JSON.stringify(packageJson, null, 2)
  51. );
  52. }
  53. }
  54. progressBar.increment();
  55. }
  56. progressBar.stop();
  57. console.log(clc.blue("=====执行初始化====="));
  58. const installCommand =
  59. "pnpm i --registry http://192.168.20.245:4873/ || yarn --registry http://192.168.20.245:4873/ || npm i --registry http://192.168.20.245:4873/";
  60. try {
  61. await new Promise((resolve, reject) => {
  62. const childProcess = exec(
  63. installCommand,
  64. { cwd: projectDir },
  65. (error) => {
  66. if (error) {
  67. reject(error);
  68. } else {
  69. resolve();
  70. }
  71. }
  72. );
  73. childProcess.stdout.on("data", (data) => {
  74. console.log(data.trim());
  75. });
  76. });
  77. console.log(clc.green("=====初始化完成====="));
  78. } catch (error) {
  79. console.log(
  80. clc.red(`Error executing installation command: ${error.message}`)
  81. );
  82. }
  83. });
  84. program.parse(process.argv);
  85. function getPackageVersion(pkgName) {
  86. let version = "1.0.0";
  87. try {
  88. const componentsVersion = execSync(
  89. "npm info " + pkgName + " version --registry http://192.168.20.245:4873"
  90. );
  91. version = componentsVersion.toString().trim();
  92. } catch (err) {
  93. console.log(clc.red("获取 " + pkgName + " 版本号失败"));
  94. }
  95. return version;
  96. }