【cobra】手写你的第一个命令行脚手架工具 | cobra整合go template通过终端以命令行方式生成.drone.yml 模板

这篇具有很好参考价值的文章主要介绍了【cobra】手写你的第一个命令行脚手架工具 | cobra整合go template通过终端以命令行方式生成.drone.yml 模板。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

零、前言

本次教程使用的开源框架如下:

名字 开源地址 作用
Cobra 命令行工具 https://github.com/spf13/cobra
Aurora 字体颜色 https://github.com/logrusorgru/aurora
go-zero go-z框架 模板功能 https://github.com/zeromicro/go-zero

本项目完整源码:https://github.com/ctra-wang/cobra-gen-drone

一、初识 Cobra

【cobra】手写你的第一个命令行脚手架工具 | cobra整合go template通过终端以命令行方式生成.drone.yml 模板,golang,go,golang,开发语言,后端,cobra,脚手架

1、Cobra作用

概述:Cobra 是一个 Golang 包,它提供了简单的接口来创建命令行程序。同时,Cobra 也是一个应用程序,用来生成应用框架,从而开发以 Cobra 为基础的应用。
代表作dockerk8shelm

详细使用就不在这里详细介绍了

  • 推荐文章如下:

官方文档:https://cobra.dev/

Go 语言现代命令行框架 Cobra 详解:https://jianghushinian.cn/2023/05/08/go-modern-command-line-framework-cobra-details/

Cobra 快速入门 - 专为命令行程序而生:https://blog.csdn.net/xcbeyond/article/details/119429114

  • 推荐视频如下:

cobra的基本使用

二、go template

这里是我们要渲染模板(.tpl格式结尾的文件)
通过渲染模板,才能输出我们想要的最终文件

1、go template 使用

详细使用和说明接不介绍了

  • 推荐文章如下:
    go template使用:https://blog.csdn.net/skh2015java/article/details/126213329

关于template
我们可以使用 .tpl的文件,也可以直接用 ``字符串包裹进行渲染。主要使用go中 {{}} 双大括号的特性

三、开始项目

整个项目目录如下:
【cobra】手写你的第一个命令行脚手架工具 | cobra整合go template通过终端以命令行方式生成.drone.yml 模板,golang,go,golang,开发语言,后端,cobra,脚手架

1、创建项目整理目录

1.1、创建go.mod 和 cmd文件夹

go mod init xxxx

mkdir cmd

1.2、创建main文件

package main

import (
	"app/cmd"
)

func main() {
	cmd.Execute()
}

1.3、在cmd文件夹创建cmd.go

代码如下

package cmd

import (
	"fmt"
	"github.com/logrusorgru/aurora"
	"github.com/spf13/cobra"
	"os"
)

// droneCmd represents the drone command
var droneCmd = &cobra.Command{
	Use:   "drone",
	Short: "drone is very good",
	Long:  `创建drone的指令`,
	RunE:  DroneGenerator, //步骤一
}

var (
	//步骤三
	DroneName   string
	GoPrivate   string
	ServiceName string
	ServiceType string
	GitBranch   string
	Registry    string
	Repo        string
	Tag         string
)

func Execute() {
	if err := droneCmd.Execute(); err != nil {
		fmt.Println(aurora.Red(err.Error()))
		os.Exit(1)
	}
}

func init() {
	// drone --droneName="base" --go_private="gitee.com" --service_name="baserpc.go" --service_type="rpc" --gitBranch="master" --registry="registry.cn-beijing.aliyuncs.com" --repo="registry.cn-beijing.aliyuncs.com/ctra_test/ctra-go-zhiye-rpc" --tag="latest"
	// drone -d="base" -g="gitee.com" -s="baserpc.go" -x="rpc" -b="master" -r="registry.cn-beijing.aliyuncs.com" -o="registry.cn-beijing.aliyuncs.com/ctra_test/ctra-go-zhiye-rpc" -t="latest"

	// 步骤二
	droneCmd.Flags().StringVarP(&DroneName, aurora.Yellow("droneName").String(), "d", "", aurora.Green(`The Drone name`).String())
	droneCmd.Flags().StringVarP(&GoPrivate, "go_private", "g", "", aurora.Green(`Go private (default "gitee.com")`).String())
	droneCmd.Flags().StringVarP(&ServiceName, "service_name", "s", "", aurora.Green(`The service name of the project`).String())
	droneCmd.Flags().StringVarP(&ServiceType, "service_type", "x", "", aurora.Green(`The service type, such as rpc | api`).String())
	droneCmd.Flags().StringVarP(&GitBranch, "gitBranch", "b", "", `The branch of the remote repo, it does work with --remote (default "master")`)
	droneCmd.Flags().StringVarP(&Registry, "registry", "r", "", `The remote git repo of the template, --home and --remote cannot be set at the same time, if they are, --remote has higher priority  
    The git repo directory must be consistent with the https://github.com/zeromicro/go-zero-template directory structure`)
	droneCmd.Flags().StringVarP(&Repo, "repo", "o", "", aurora.Green(`The project git repository`).String())
	droneCmd.Flags().StringVarP(&Tag, "tag", "t", "", aurora.Green("Git tag (default \"latest\")").String())

	// Here you will define your flags and configuration settings.

	// Cobra supports Persistent Flags which will work for this command
	// and all subcommands, e.g.:
	droneCmd.PersistentFlags().String("droneName", "", "A help for foo")

	// Cobra supports local flags which will only run when this command
	// is called directly, e.g.:
	// droneCmd.Flags().BoolP("toggle", "t", false, "Help message for toggle")
}

1.4、在cmd文件夹创建 drone.go

package cmd

import (
	_ "embed"
	"fmt"
	"github.com/logrusorgru/aurora"
	"github.com/spf13/cobra"
	"github.com/zeromicro/go-zero/tools/goctl/util/pathx"
	"os"
	"strings"
	"text/template"
)

var (
	//go:embed drone.tpl
	UsageTpl string
)

type Drone struct {
	//步骤三
	DroneName   string
	GoPrivate   string
	ServiceName string
	ServiceType string
	GitBranch   string
	Registry    string
	Repo        string
	Tag         string
}

func DroneGenerator(_ *cobra.Command, _ []string) error {

	// 步骤四
	// 对所有的传入的参数进行一一判断
	dronename := DroneName
	if len(dronename) == 0 {
		dronename = "dronegen-greet"
	}

	goprivate := GoPrivate
	fmt.Println(len(strings.Split(goprivate, ".")))
	if len(strings.Split(goprivate, ".")) <= 1 {
		return fmt.Errorf("error go private!")
	}

	serviceName := ServiceName
	serviceType := ServiceType
	gitBranch := GitBranch
	registry := Registry
	repo := Repo
	tag := Tag

	file, err := os.Create("drone.yml")
	if err != nil {
		fmt.Println("文件创建失败:", err)
		return err
	} else {
		fmt.Println("文件创建成功!")
	}

	defer file.Close()

	text, err := pathx.LoadTemplate("dronegen", "drone.tpl", UsageTpl)
	if err != nil {
		fmt.Println("打开模板失败:", err)
		return err
	} else {
		fmt.Println("打开模板成功!")
	}

	t := template.Must(template.New("dronegen").Parse(text))
	return t.Execute(file, Drone{
		DroneName:   dronename,
		GoPrivate:   goprivate,
		ServiceName: serviceName,
		ServiceType: serviceType,
		GitBranch:   gitBranch,
		Registry:    registry,
		Repo:        repo,
		Tag:         tag,
	})
	fmt.Println(aurora.Green("Done."))

	return nil
}

1.5、创建 drone.tpl 模板文件

kind: pipeline
type: docker
name: {{.DroneName}}-{{.ServiceType}}
steps:
  - name: build-go
    image: golang:1.20.3
    depends_on: [clone]
    volumes:
      - name: go_cache
        path: /go/pkg/mod
    commands:
      - go env -w CGO_ENABLED=0
      - go env -w GOPROXY=https://goproxy.cn,direct
      - go env -w GOPRIVATE= {{.GoPrivate}}
      - go mod tidy && go build -trimpath -ldflags "-s -w" -o app {{.ServiceName}}.go

  - name: build-{{.ServiceType}}
    image: plugins/docker:20
    environment:
      DRONE_REPO_BRANCH: {{.GitBranch}}
    depends_on: [build-go]
    settings:
      dockerfile: Dockerfile
      registry: {{.Registry}}
      repo: {{.Repo}}:{{.Tag}}
      auto_tag: true
      insecure: true
      username:
        from_secret: docker_username
      password:
        from_secret: docker_password
trigger:
  ref:
    - refs/tags/*
    - refs/heads/master

volumes:
  - name: go_cache
    host:
      path: /root/.go/cache

2、goland中如何调试?

这种命令行的代码调试和传统的main入口程序调试是完全不一样的

2.1、Edit configurations

配置这里
【cobra】手写你的第一个命令行脚手架工具 | cobra整合go template通过终端以命令行方式生成.drone.yml 模板,golang,go,golang,开发语言,后端,cobra,脚手架

2.2、program argument

这里很重要,如果这里不设置我们需要输入的指令值,则无法进入对应的断点

【cobra】手写你的第一个命令行脚手架工具 | cobra整合go template通过终端以命令行方式生成.drone.yml 模板,golang,go,golang,开发语言,后端,cobra,脚手架

3、编译执行

3.1、将文件编译成二进制文件

go build main.go

3.2、执行

长指令

drone -d="base" -g="gitee.com" -s="baserpc.go" -x="rpc" -b="master" -r="registry.cn-beijing.aliyuncs.com" -o="registry.cn-beijing.aliyuncs.com/ctra_test/ctra-go-zhiye-rpc" -t="latest"

短指令

drone --droneName="base" --go_private="gitee.com" --service_name="baserpc.go" --service_type="rpc" --gitBranch="master" --registry="registry.cn-beijing.aliyuncs.com" --repo="registry.cn-beijing.aliyuncs.com/ctra_test/ctra-go-zhiye-rpc" --tag="latest"

可以看到drone.yml 文件已经生成
【cobra】手写你的第一个命令行脚手架工具 | cobra整合go template通过终端以命令行方式生成.drone.yml 模板,golang,go,golang,开发语言,后端,cobra,脚手架

4、注意这里踩得大坑

来看一下在 Drone 的配置页面中
Configuration 默认的文件名的前缀 是 点!!!

【cobra】手写你的第一个命令行脚手架工具 | cobra整合go template通过终端以命令行方式生成.drone.yml 模板,golang,go,golang,开发语言,后端,cobra,脚手架

Golang中的 os.create()函数

	file, err := os.Create("drone.yml")
	if err != nil {
		fmt.Println("文件创建失败:", err)
		return err
	} else {
		fmt.Println("文件创建成功!")
	}

如果我们使用默认的 .drone.yml,则我们将编译好的文件在哪执行都不会产生这个文件!!十分之坑文章来源地址https://www.toymoban.com/news/detail-600714.html

file, err := os.Create(".drone.yml")

到了这里,关于【cobra】手写你的第一个命令行脚手架工具 | cobra整合go template通过终端以命令行方式生成.drone.yml 模板的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 快速搭建一个go语言web后端服务脚手架

    快速搭建一个go语言web后端服务脚手架 源码:https://github.com/weloe/go-web-demo web框架使用gin,数据操作使用gorm,访问控制使用casbin 首先添加一下自定义的middleware recover_control.go ,统一处理panic error返回的信息 access_control.go 使用casbin进行访问控制的中间件 reader.go 读取yaml配置文件

    2023年04月12日
    浏览(71)
  • 前端架构师-week4-脚手架命令注册和执行过程开发

    基于 Commander 完成脚手架命令注册和命令执行过程开发 ·如何设计高性能脚手架(缓存 + 多进程 实现这一点) ·Node 多进程开发 ·javascript 面向对象的实战技巧(达到可扩展 高复用) ·图解高性能脚手架架构设计方法 ·封装通用的 Package 和 Command 类 ·基于缓存 + Node 多进程实现

    2024年02月01日
    浏览(53)
  • mac下安装vue cli脚手架并搭建一个简易项目

    1、确定本电脑下node和npm版本是否为项目所需版本。 2、下载vue脚手架 3、创建项目 如果有node,打开终端,输入node -v和npm -v , 确保node和npm的版本,(这里可以根据自己的需求去选择,如果对最新版本的内容有要求,也可以选择最新版本)如果没有node,可以点击nodejs官网去下载

    2024年02月15日
    浏览(93)
  • 从0搭建Vue3组件库(十):如何搭建一个 Cli 脚手架

    本篇文章将实现一个名为 create-easyest 脚手架的开发,只需一个命令 npm init easyest 就可以将整个组件库开发框架拉到本地。 首先,我们在 packages 目录下新建 cli 目录,同执行 pnpm init 进行初始化,然后将包名改为 create-easyest 这里需要知道的是当我们执行 npm init xxx 或者 npm create xxx 的

    2024年02月08日
    浏览(91)
  • Mac OS安装Vue CLI脚手架并创建一个基础项目教程

    前后端分离 可以大大地提高开发效率,主流的解决方案为 Vue.js+SpringBoot ,这里主要介绍 Vue在Mac端的入门教程 。软硬件环境为Macbook Air M2+macOS Vantura 13.4.1。 Vue (发音为 /vjuː/,类似 view) 是一款用于 构建用户界面 的 JavaScript 框架,是官方提供的 基于 Webpack 的 Vue 工具链 。它基

    2024年02月04日
    浏览(101)
  • 前端架构: 脚手架命令行交互核心实现之inquirer和readline的应用教程

    命令行交互核心实现 核心目标:实现命令行行交互,如List 命令行的交互呢比命令行的渲难度要更大,因为它涉及的技术点会会更多 它涉及以下技术点 键盘输入的一个监听 (这里通过 readline 来实现) 计算命令行窗口的尺寸 清屏 光标的移动 输出流的静默 (我们输出的内容, 不

    2024年04月23日
    浏览(42)
  • go-Nunu,一个好用的脚手架推荐,助你快速构建Go应用

    虽然直接使用go-gin等框架也很简单,但是涉及数据库、jwt认证、配置文件和日志记录等全套的服务,一个个集成进来也挺费事。关键是一个个集成,很难做到结构清晰和分层合理。这里推荐一个好用的脚手架Nunu,太好用啦,可以让你把精力直接放在业务上直接开干。 Nunu 是一

    2024年02月17日
    浏览(50)
  • uniapp使用cli脚手架创建兼容小程序和h5的项目 自动化命令打包运行

    HbuliderX搭建项目结构: CLI搭建项目结构: CLI方式搭建uniapp项目: 大家可以看下两种方式搭建的项目文件夹目录有什么区别,上面的是HbuilderX模版搭建的小程序项目,下面的是cli搭建的项目,先把my-test项目中src下面的文件全部删除,然后我把小程序代码全部塞进了src文件夹下

    2024年02月16日
    浏览(71)
  • 使用npm install -g @vue/cli 命令安装最新的脚手架与Vue版本不匹配的问题

    使用npm install -g @vue/cli 命令安装最新的脚手架 创建项目时不要选择Vue版本,让它默认选择(默认选择 Vue2)否则会出现 vue版本和脚手架版本vue-cli 不兼容的问题(怪哉) 脚手架兼容vue2 不兼容vue3 ? 不理解,记录一下,后续整理 Vue-cli版本 vue 版本 创建项目时 ,选择默认不要

    2024年02月12日
    浏览(63)
  • 三、创建脚手架和脚手架分析

    1、安装node.js **下载地址:**https://nodejs.org/zh-cn/ 界面展示 2、检查node.js版本 查看版本的两种方式 node -v node -version 出现版本号则说明安装成功(最新的以官网为准) 3、为了提高我们的效率,可以使用淘宝的镜像源 输入: npm install -g cnpm --registry=https://registry.npm.taobao.org 即可安

    2024年02月22日
    浏览(52)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包