「100%提高开发效率🔥」从零到一带你快速实现企业级CLI工具🐬

简介: 「100%提高开发效率🔥」从零到一带你快速实现企业级CLI工具🐬

image.png


大家好,我是速冻鱼🐟,一条水系前端💦,喜欢花里胡哨💐,持续沙雕🌲,是隔壁寒草🌿的好兄弟,刚开始写文章。如果喜欢我的文章,可以关注➕点赞,为我注入能量,与我一同成长吧~


阅读本文 🦀


1.您将了解到什么是CLI

2.您将了解到什么是Docker

3.您将了解到什么是NodeJs

4.您将了解到如何从零到一快速实现一个CLI工具

5.您将了解到如何在我们的项目中使用自己编写的CLI工具

本文章对应项目craft-client仓库地址 :crft-client🎄

前言 🌵


造这个cli工具是因为公司之前的项目用的docker镜像生成工具🔧是基于gradlegroovy来实现的,显然在前端项目中出现这种东西不太美观,而且项目结构会比较混乱,新接触项目的小伙伴看见项目里这些看不懂的东西就是一脸懵逼不太友好,所以就基于NodeJs环境来重新实现我们的docker镜像生成CLI工具吧^_^

前置知识 🐳


什么是CLI?


image.png


CLI(command-line-interface) 是一个命令行程序,它接受文本输入以执行操作系统功能。简单得来说就是可以通过命令行来执行的程序,不同于我们的图形操作界面而已。例如我们比较熟悉的CLI工具有npmvue-clicreat-react-app等等都是我们比较熟悉的CLI工具。 我们通过CLI执行操作系统功能,最主要的作用我认为可以让将日常繁琐且重复的开发步骤简化并抽象为一个CLI工具,帮助我们简化开发,Don not repeat yourself !!!

vue-cli


image.png


creat-react-app 


image.png

什么是Docker?


image.png


docker是一项操作系统层面的虚拟化技术,本文重点不在介绍docker,说人话docker就是虚拟机,我们在docker中运行我们的程序(比如web应用web服务器等等)。


什么是NodeJs?

image.png


我认为知道以下两点就够了


  • Node.js 是一个开源跨平台JavaScript 运行时环境。 它是一个可用于几乎任何项目的流行工具!
  • Node.js 在浏览器外运行 V8 JavaScript 引擎(Google Chrome 的内核)。


需求 💻


  • Web静态站点项目生成基于Nginx的Docker镜像文件
  • Node应用项目生成基于Node的Docker镜像文件
  • Web静态站点+Web服务器应用项目生成基于Node的Docker镜像文件

开发思路 ⭐


下面我将带领各位小伙伴一起实现我们的第一个需求,对Web静态站点项目生成基于NginxDocker镜像文件,其他需求实现类似,就不一一实现了。


1. 首先是初始化项目啦


npm init 初始化我们的CLI项目就叫craft-client

craft-clinet


image.png

2. 如何让CLI工具在项目中运行呢?


2.1 配置package.json

这里一定要在package.json文件中配置bin,为你这个ClI工具指定执行的入口文件

package.json

//、、、
  "bin": {
    "craft": "bin/craft.js"
  },
  "author": "sudongyu",
  "license": "ISC",
  "dependencies": {
    "commander": "^8.2.0",
    "cpy": "^8.1.2",
    "figlet": "^1.5.2",
    "make-dir": "^3.1.0",
    "process": "^0.11.10",
    "shelljs": "^0.8.4"
  },
//、、、
}

2.2 在项目中创建bin文件夹并书写我们的入口文件


image.png

2.3 编写我们的入口craft.js文件


一定要在开头指定我们代码的执行环境#!/usr/bin/env node这里我们指定为node环境

craft.js


#!/usr/bin/env node
import {cwd} from 'process';
import path from "path";
import {Command} from 'commander/esm.mjs';
import {createRequire} from "module";
import {frameworkDockerTask, nginxDockerTask, nodeDockerTask} from './tasksUtiles/index.js'
//踩坑,在node中使用esm必须写完整路径.js不能简写


3. 获取package.json文件对象信息


这里我们获取调用CLI工具项目的package.json 文件对象获取我们需要的信息,获取当前项目名称类型等等,方便我们后边的代码编写

craft.js


tips:这里获取package.json文件对象必须使用commonJs规范才行


const require = createRequire(import.meta.url);
//获取PackgeJson文件信息
let pkgManifest = require(path.join(cwd(), 'package.json'));
//获取craft配置信息对象
let craftConfig = pkgManifest?.craft;

4. 使用Commander库来获取命令行参数

使用第三方库Commander可以很方便的获取命令行参数,生成我们的帮助信息命令等等


craft.js


import {Command} from 'commander/esm.mjs
const program = new Command();
program.option('-d, --docker', 'generate docker image');
program.addHelpText('after', `
Example call:
  $ craft-h --help`);
program.parse(process.argv);
//获取命令行参数
const options = program.opts();


5. 根据命令行参数来生成不同类型的Docker镜像文件


craft.js

//根据docker命令执行打包docker镜像
if (options.docker) {
    try {
        //1.输出开始打包docker日志
        console.log(`- craft docker running ^_^ !!!!`);
        //2.获取配置文件信息
        switch (craftConfig.buildType) {
            case "web":
                console.log(`
            ###################
            web docker building
            ###################
            `)
                nginxDockerTask(craftConfig.web.distDir)
                break;
            case "node":
                console.log(`
            ####################
            node docker building
            ####################
            `)
                nodeDockerTask()
                break;
            case "lib":
                console.log('node docker building')
                break;
            case "framework":
                console.log(`
            #########################
            framework docker building
            #########################
            `)
                frameworkDockerTask()
                break;
            default :
                console.log('can not find buildType')
        }
    } catch (e) {
            console.error(`
            ==========================
            craft docker faild ! ! !
            ==========================
            `,e)
    }
}


6. 生成基于nginx的Docker镜像文件


这里我们以web静态站点项目为例,所以我们要生成一个基于nginx的Docker镜像,我们就需要生成nginx的配置文件,在dockerFile引入等。

  • 首先我们需要将web项目打包好的dist目录复制到build目录下 (这里我们会临时创建一个build目录用来放置打包好的dist文件和nginx相关配置文件,方便我们后续生成镜像)
  • 在build目录下生成nginxConfig配置文件
  • 生成基于nginx的DockerFile文件(用来生成镜像的文件)
  • 生成胡哨的命令行文字图片(表示我们镜像生成完成了)

NginxDockerTask.js


async function nginxDockerTask(buildDir = 'dist') {
    //多加一次为空串的判断,防止后边cpy拷贝所有目录
    if(!buildDir)buildDir="dist"
    // Copy buildDir to build/buildDir
    await copyFile(buildDir,'build')
    //生成NginxConfig
    await generateNginxConfig()
    //生成NginxDockerFile
    await generateNginxDockerFile()
    // 生成docker镜像文件
    await generateDockerImage()
    //展示craft图案执行完成
    showFiglet()
}

tips:我们可以使用cpy开源库来拷贝文件,使用figlet来展示文字图片,使用NodeJs提供的fs文件操作系统API来写入我们的数据


7. 测试我们CLI工具的完整流程


  • 在项目中引入我们编写好的CLI工具并配置package.json文件


package.json


{
  "name": "XXX",
  "version": "0.1.0",
  "scripts": {
    "dev": "vite",
    "build": "vite build",
    "craft-h": "craft -h",//这里就是我们CLI脚本命令
    "craft-docker": "craft --docker"//这里就是我们CLI脚本命令
  },
  //我们的CLI工具需要的配置信息
  "craft": {
    "buildType": "framework",
    "web": {
      "distDir": ""
    },
    "node": {
      "command": ""
    },
    "framework": {
      "web": "",
      "server": ""
    }
  },
  //导入我们CLI工具库
  "devDependencies": {
    "@imf/craft-client": "^1.0.1"
  }
}
  • shell中执行我们的脚本命令


shell


npm run craft-docker

成功在shell看见我们花里胡哨的LOGO,表示镜像成功生成


shell

image.png

在Docker DeskTop软件中查看我们的镜像并运行

image.png

镜像成功运行

image.png

总结 🍁


到这我们的CLI工具就完成啦🌈,通过编写CLI工具可以提高项目开发的效率,将重复的工作进行抽象,希望每个小伙伴都能够自己动手实现一个提升效能的CLI工具,一起感受它的魅力吧🤹‍♂️~

相关文章
|
8月前
|
Dubbo 前端开发 Java
让你在组建企业级项目时手到擒来——浅谈各类常用工具和框架概述
让你在组建企业级项目时手到擒来——浅谈各类常用工具和框架概述
|
2月前
|
前端开发 Android开发 开发者
移动应用的构建之路:从开发到部署
【10月更文挑战第32天】本文将深入探讨移动应用的开发和部署,包括移动操作系统的选择、应用开发的生命周期、以及如何将应用有效地推向市场。我们将通过实际代码示例和清晰的步骤指导,帮助读者理解移动应用开发的全过程。无论你是初学者还是有经验的开发者,这篇文章都将为你提供有价值的见解和技巧。让我们一起探索移动应用的世界,发现它的魅力和挑战吧!
|
5月前
|
前端开发 JavaScript 测试技术
构建与部署全栈JavaScript应用:从构思到上线的完整指南
【8月更文挑战第9天】构建和部署一个全栈JavaScript应用是一个复杂但充满挑战的过程。从需求分析到项目上线,每一步都需要精心策划和严格执行。通过本文的指南,希望能帮助你更好地理解和掌握全栈JavaScript应用的开发流程,从而打造出高性能、高可用、易维护的应用。
|
5月前
|
Rust Cloud Native 安全
哇塞!Rust 在云原生环境中搞大事啦!构建微服务竟如此酷炫,你还不来看看?
【8月更文挑战第31天】《构建微服务:Rust 在云原生环境中的实践》探讨了 Rust 语言凭借其内存安全、高性能及可靠性等特性,在快速发展的云计算领域构建微服务的优势。书中介绍了选择合适框架(如 Axum 和 Tide)、容器化部署、服务间通信及确保服务可靠性等方面的内容,并展示了 Rust 在云原生环境中的广泛应用前景。
202 0
|
7月前
|
前端开发 JavaScript 数据库
从零开始搭建创业公司全新技术栈解决方案
创业公司在初期面临的挑战之一就是如何构建一个既能满足当前需求,又能适应未来发展的技术栈。本文将全面探讨从后端到前端,再到云原生技术和AI大模型应用的各个层面,帮助创业者了解如何选择合适的开发语言、框架、工具,以及如何制定有效的开发流程,从而搭建一个强大而稳定的技术体系。
557 1
从零开始搭建创业公司全新技术栈解决方案
|
Cloud Native IDE Java
阿里巴巴正式开源云原生应用脚手架
12 月 3 日,微服务 x 容器开源开发者 Meetup 上海站上,阿里云智能技术专家,云原生应用脚手架项目负责人良名宣布阿里巴巴云原生应用脚手架项目正式开源,并在现场做了相关内容介绍。
646 16
阿里巴巴正式开源云原生应用脚手架
|
数据可视化 JavaScript 前端开发
低代码平台名声臭,用起来却真香——60%开发者不敢承认
低代码平台名声臭,用起来却真香——60%开发者不敢承认
117 0
|
人工智能 小程序 测试技术
自动化测试工具软测界的不二之选,还不快速来了解
自动化测试工具软测界的不二之选,还不快速来了解
202 0
|
存储 人工智能 运维
我心中的云时代原生开发环境
试想,如果未来的应用开发,开发者通过函数计算、弹性容器服务等能力去承载自己的业务逻辑,存储、数据库、消息等中间件能力通过 Backend as a Service 的方式去获取,即未来使用云计算的开发者能够无需关心云计算的基础底层概念,直接聚焦自己的业务开发,以近乎无感的方式获得云计算的帮助。基于这样的趋势的预判,本文作者开始在云原生的路径上探索,并致力于为云时代的原住民开发者提供一个理想的一站式的开发工作环境:云原生 Serverless 开发者工作平台。
716 0
我心中的云时代原生开发环境
|
Java 应用服务中间件 持续交付
《小团队web技术搭建》(二)环境和工具的准备-第二部分
《小团队web技术搭建》(二)环境和工具的准备-第二部分
130 0