头图

开始一个新的软件项目可能是一个耗时且重复的过程。开发人员通常需要创建项目结构并包含各种配置文件和依赖项才能使项目运行。这些需求通常称为样板代码,可以跨项目重用。虽然许多框架提供 CLI 命令来简化启动项目的过程,但它们可能无法涵盖所有用例。

例如,开发人员可能需要重用以前编写的代码,例如 linting 配置、数据库配置和相关代码片段。对每个项目重复这些任务可能会带来压力并且容易出错。简化流程的一种方法是创建一个 CLI 工具,根据特定需求生成项目启动器和代码片段。

CLI 脚手架工作流程设计

相信大家都用过Vue cli , 或者 create-react-app . 这些比较知名的项目脚手架。 我们根据使用的过程,可以把一个CLI 脚手架的工作过程分为 输入询问、 结果拼装、 拉取代码、 代码后处理那么几部分。

基础准备

请确保您在开始之前已经对 node.js 有了一个基本的了解。 本文所用到的技术 和 周边库如下所示。

  • NodeJS
  • JavaScript
  • NPM
  • fs-extra
  • simple-git
  • commander

创建你的cli 工具

  1. 初始化工程

首先,我们要初始化一个新的node.js 项目, 通过 npm init 初始化一个默认的 package.json 文件。 打开你的终端,输入以下命令:

mkdir my-cli-tool
cd my-cli-tool
npm init -y
  1. 添加依赖

接下来,我们需要安装一些依赖库。我们将使用 commander 来处理命令行参数和选项,使用 simple-git 来操作 Git 仓库,还将使用 fs-extra 来处理文件系统操作。

npm install commander simple-git fs-extra
  1. 编写 CLi 脚本

在项目根目录下创建一个名为 index.js 的文件,并在文件顶部添加以下内容:

#!/usr/bin/env node

const { Command } = require('commander');
const simpleGit = require('simple-git');
const path = require('path');
const fs = require('fs-extra');

const program = new Command();

这段代码引入了必要的模块,并创建了一个新的 Command 实例。

  1. 实现核心功能
#!/usr/bin/env node

const { Command } = require('commander');
const simpleGit = require('simple-git');
const path = require('path');
const fs = require('fs-extra');

const program = new Command();

/**
 * 从 gitlab 或者github 创建一个项目模板
 * @param {string} projectName - 项目名称
 * @returns {Promise<CreateProjectResult>}
 */
const createProject = async (projectName) => {
  const git = simpleGit();
  const repoUrl = 'https://gitlab.com/your-username/your-template-repo.git';
  const targetPath = path.join(process.cwd(), projectName);

  try {
    console.log(`Cloning template from ${repoUrl}...`);
    await git.clone(repoUrl, targetPath);
    console.log('Template cloned successfully.');

    /**
    *  因为,通过simpleGit 的clone 命令, 下载下来的模板,git 信息是指向模板库的,
    *  所以我们需要通过 代码后处理 删除.git 目录并初始化为一个空的git 工程
    */ 
    await fs.remove(path.join(targetPath, '.git'));
    console.log('.git directory removed.');

    // 初始化成全新的git 项目
    await git.cwd(targetPath).init();
    console.log('Initialized a new git repository.');

    console.log(`Project created at ${targetPath}`);
    return { success: true, message: `Project created at ${targetPath}` };
  } catch (error) {
    console.error('Failed to clone template:', error);
    return { success: false, message: 'Failed to clone template', error };
  }
};

program
  .version('1.0.0')
  .description('CLI tool for creating projects from GitLab templates');

program
  .command('create <project-name>')
  .description('Create a new project from the GitLab template')
  .action(async (projectName) => {
    const result = await createProject(projectName);
    if (result.success) {
      console.log(result.message);
    } else {
      console.error(result.message);
      if (result.error) {
        console.error(result.error);
      }
    }
  });

program.parse(process.argv);

如上代码, 我们通过 simpleGit 工具,从模板库中下载并初始化了一个全新的git 项目。

  1. 测试 - 本地调试

我们要进行调试, 首先应该在 package.json 中,指定可运行脚本。 如下所示:

{
    "name": "xxx-cli",
    "author": "Sean.shi"
  "bin": {
    "my-cli-tool": "./index.js"
  },
  ...
  ...
}

通过 npm link 命令在本地链接你的 CLI 工具以进行测试:

npm link

现在,你可以使用以下命令来测试你的 CLI 工具:

my-cli-tool create test-creat

总结

通过以上步骤,我们成功打造了一个通用的 Node.js CLI 脚手架工具。这个工具可以极大地提升我们创建新项目的效率,并且可以根据需要进行扩展和自定义。希望这篇文章对你有所帮助,祝你开发顺利!

当然,我们还可以通过,colors.js 去把我们的日志做的更美观。 但那不在本文讨论范围内。


Sean
38 声望4 粉丝