create-dage-backend-cli 3.2 KB

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