国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【cobra】手寫(xiě)你的第一個(gè)命令行腳手架工具 | cobra整合go template通過(guò)終端以命令行方式生成.drone.yml 模板

這篇具有很好參考價(jià)值的文章主要介紹了【cobra】手寫(xiě)你的第一個(gè)命令行腳手架工具 | cobra整合go template通過(guò)終端以命令行方式生成.drone.yml 模板。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

零、前言

本次教程使用的開(kāi)源框架如下:

名字 開(kāi)源地址 作用
Cobra 命令行工具 https://github.com/spf13/cobra
Aurora 字體顏色 https://github.com/logrusorgru/aurora
go-zero go-z框架 模板功能 https://github.com/zeromicro/go-zero

本項(xiàng)目完整源碼:https://github.com/ctra-wang/cobra-gen-drone

一、初識(shí) Cobra

【cobra】手寫(xiě)你的第一個(gè)命令行腳手架工具 | cobra整合go template通過(guò)終端以命令行方式生成.drone.yml 模板,golang,go,golang,開(kāi)發(fā)語(yǔ)言,后端,cobra,腳手架

1、Cobra作用

概述:Cobra 是一個(gè) Golang 包,它提供了簡(jiǎn)單的接口來(lái)創(chuàng)建命令行程序。同時(shí),Cobra 也是一個(gè)應(yīng)用程序,用來(lái)生成應(yīng)用框架,從而開(kāi)發(fā)以 Cobra 為基礎(chǔ)的應(yīng)用。
代表作docker、k8s、helm

詳細(xì)使用就不在這里詳細(xì)介紹了

  • 推薦文章如下:

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

Go 語(yǔ)言現(xiàn)代命令行框架 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格式結(jié)尾的文件)
通過(guò)渲染模板,才能輸出我們想要的最終文件

1、go template 使用

詳細(xì)使用和說(shuō)明接不介紹了

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

關(guān)于template
我們可以使用 .tpl的文件,也可以直接用 ``字符串包裹進(jìn)行渲染。主要使用go中 {{}} 雙大括號(hào)的特性

三、開(kāi)始項(xiàng)目

整個(gè)項(xiàng)目目錄如下:
【cobra】手寫(xiě)你的第一個(gè)命令行腳手架工具 | cobra整合go template通過(guò)終端以命令行方式生成.drone.yml 模板,golang,go,golang,開(kāi)發(fā)語(yǔ)言,后端,cobra,腳手架

1、創(chuàng)建項(xiàng)目整理目錄

1.1、創(chuàng)建go.mod 和 cmd文件夾

go mod init xxxx

mkdir cmd

1.2、創(chuàng)建main文件

package main

import (
	"app/cmd"
)

func main() {
	cmd.Execute()
}

1.3、在cmd文件夾創(chuàng)建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:  `創(chuàng)建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文件夾創(chuàng)建 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 {

	// 步驟四
	// 對(duì)所有的傳入的參數(shù)進(jìn)行一一判斷
	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("文件創(chuàng)建失敗:", err)
		return err
	} else {
		fmt.Println("文件創(chuàng)建成功!")
	}

	defer file.Close()

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

	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、創(chuàng)建 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中如何調(diào)試?

這種命令行的代碼調(diào)試和傳統(tǒng)的main入口程序調(diào)試是完全不一樣的

2.1、Edit configurations

配置這里
【cobra】手寫(xiě)你的第一個(gè)命令行腳手架工具 | cobra整合go template通過(guò)終端以命令行方式生成.drone.yml 模板,golang,go,golang,開(kāi)發(fā)語(yǔ)言,后端,cobra,腳手架

2.2、program argument

這里很重要,如果這里不設(shè)置我們需要輸入的指令值,則無(wú)法進(jìn)入對(duì)應(yīng)的斷點(diǎn)

【cobra】手寫(xiě)你的第一個(gè)命令行腳手架工具 | cobra整合go template通過(guò)終端以命令行方式生成.drone.yml 模板,golang,go,golang,開(kāi)發(fā)語(yǔ)言,后端,cobra,腳手架

3、編譯執(zhí)行

3.1、將文件編譯成二進(jìn)制文件

go build main.go

3.2、執(zhí)行

長(zhǎng)指令

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 文件已經(jīng)生成
【cobra】手寫(xiě)你的第一個(gè)命令行腳手架工具 | cobra整合go template通過(guò)終端以命令行方式生成.drone.yml 模板,golang,go,golang,開(kāi)發(fā)語(yǔ)言,后端,cobra,腳手架

4、注意這里踩得大坑

來(lái)看一下在 Drone 的配置頁(yè)面中
Configuration 默認(rèn)的文件名的前綴 是 點(diǎn)!?。?/code>

【cobra】手寫(xiě)你的第一個(gè)命令行腳手架工具 | cobra整合go template通過(guò)終端以命令行方式生成.drone.yml 模板,golang,go,golang,開(kāi)發(fā)語(yǔ)言,后端,cobra,腳手架

Golang中的 os.create()函數(shù)

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

如果我們使用默認(rèn)的 .drone.yml,則我們將編譯好的文件在哪執(zhí)行都不會(huì)產(chǎn)生這個(gè)文件?。∈种?span toymoban-style="hidden">文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-600714.html

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

到了這里,關(guān)于【cobra】手寫(xiě)你的第一個(gè)命令行腳手架工具 | cobra整合go template通過(guò)終端以命令行方式生成.drone.yml 模板的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 快速搭建一個(gè)go語(yǔ)言web后端服務(wù)腳手架

    快速搭建一個(gè)go語(yǔ)言web后端服務(wù)腳手架 源碼:https://github.com/weloe/go-web-demo web框架使用gin,數(shù)據(jù)操作使用gorm,訪問(wèn)控制使用casbin 首先添加一下自定義的middleware recover_control.go ,統(tǒng)一處理panic error返回的信息 access_control.go 使用casbin進(jìn)行訪問(wèn)控制的中間件 reader.go 讀取yaml配置文件

    2023年04月12日
    瀏覽(60)
  • 前端架構(gòu)師-week4-腳手架命令注冊(cè)和執(zhí)行過(guò)程開(kāi)發(fā)

    基于 Commander 完成腳手架命令注冊(cè)和命令執(zhí)行過(guò)程開(kāi)發(fā) ·如何設(shè)計(jì)高性能腳手架(緩存 + 多進(jìn)程 實(shí)現(xiàn)這一點(diǎn)) ·Node 多進(jìn)程開(kāi)發(fā) ·javascript 面向?qū)ο蟮膶?shí)戰(zhàn)技巧(達(dá)到可擴(kuò)展 高復(fù)用) ·圖解高性能腳手架架構(gòu)設(shè)計(jì)方法 ·封裝通用的 Package 和 Command 類 ·基于緩存 + Node 多進(jìn)程實(shí)現(xiàn)

    2024年02月01日
    瀏覽(26)
  • mac下安裝vue cli腳手架并搭建一個(gè)簡(jiǎn)易項(xiàng)目

    mac下安裝vue cli腳手架并搭建一個(gè)簡(jiǎn)易項(xiàng)目

    1、確定本電腦下node和npm版本是否為項(xiàng)目所需版本。 2、下載vue腳手架 3、創(chuàng)建項(xiàng)目 如果有node,打開(kāi)終端,輸入node -v和npm -v , 確保node和npm的版本,(這里可以根據(jù)自己的需求去選擇,如果對(duì)最新版本的內(nèi)容有要求,也可以選擇最新版本)如果沒(méi)有node,可以點(diǎn)擊nodejs官網(wǎng)去下載

    2024年02月15日
    瀏覽(100)
  • Mac OS安裝Vue CLI腳手架并創(chuàng)建一個(gè)基礎(chǔ)項(xiàng)目教程

    Mac OS安裝Vue CLI腳手架并創(chuàng)建一個(gè)基礎(chǔ)項(xiàng)目教程

    前后端分離 可以大大地提高開(kāi)發(fā)效率,主流的解決方案為 Vue.js+SpringBoot ,這里主要介紹 Vue在Mac端的入門教程 。軟硬件環(huán)境為Macbook Air M2+macOS Vantura 13.4.1。 Vue (發(fā)音為 /vju?/,類似 view) 是一款用于 構(gòu)建用戶界面 的 JavaScript 框架,是官方提供的 基于 Webpack 的 Vue 工具鏈 。它基

    2024年02月04日
    瀏覽(306)
  • 從0搭建Vue3組件庫(kù)(十):如何搭建一個(gè) Cli 腳手架

    從0搭建Vue3組件庫(kù)(十):如何搭建一個(gè) Cli 腳手架

    本篇文章將實(shí)現(xiàn)一個(gè)名為 create-easyest 腳手架的開(kāi)發(fā),只需一個(gè)命令 npm init easyest 就可以將整個(gè)組件庫(kù)開(kāi)發(fā)框架拉到本地。 首先,我們?cè)?packages 目錄下新建 cli 目錄,同執(zhí)行 pnpm init 進(jìn)行初始化,然后將包名改為 create-easyest 這里需要知道的是當(dāng)我們執(zhí)行 npm init xxx 或者 npm create xxx 的

    2024年02月08日
    瀏覽(91)
  • 前端架構(gòu): 腳手架命令行交互核心實(shí)現(xiàn)之inquirer和readline的應(yīng)用教程

    前端架構(gòu): 腳手架命令行交互核心實(shí)現(xiàn)之inquirer和readline的應(yīng)用教程

    命令行交互核心實(shí)現(xiàn) 核心目標(biāo):實(shí)現(xiàn)命令行行交互,如List 命令行的交互呢比命令行的渲難度要更大,因?yàn)樗婕暗募夹g(shù)點(diǎn)會(huì)會(huì)更多 它涉及以下技術(shù)點(diǎn) 鍵盤輸入的一個(gè)監(jiān)聽(tīng) (這里通過(guò) readline 來(lái)實(shí)現(xiàn)) 計(jì)算命令行窗口的尺寸 清屏 光標(biāo)的移動(dòng) 輸出流的靜默 (我們輸出的內(nèi)容, 不

    2024年04月23日
    瀏覽(19)
  • go-Nunu,一個(gè)好用的腳手架推薦,助你快速構(gòu)建Go應(yīng)用

    go-Nunu,一個(gè)好用的腳手架推薦,助你快速構(gòu)建Go應(yīng)用

    雖然直接使用go-gin等框架也很簡(jiǎn)單,但是涉及數(shù)據(jù)庫(kù)、jwt認(rèn)證、配置文件和日志記錄等全套的服務(wù),一個(gè)個(gè)集成進(jìn)來(lái)也挺費(fèi)事。關(guān)鍵是一個(gè)個(gè)集成,很難做到結(jié)構(gòu)清晰和分層合理。這里推薦一個(gè)好用的腳手架Nunu,太好用啦,可以讓你把精力直接放在業(yè)務(wù)上直接開(kāi)干。 Nunu 是一

    2024年02月17日
    瀏覽(22)
  • uniapp使用cli腳手架創(chuàng)建兼容小程序和h5的項(xiàng)目 自動(dòng)化命令打包運(yùn)行

    uniapp使用cli腳手架創(chuàng)建兼容小程序和h5的項(xiàng)目 自動(dòng)化命令打包運(yùn)行

    HbuliderX搭建項(xiàng)目結(jié)構(gòu): CLI搭建項(xiàng)目結(jié)構(gòu): CLI方式搭建uniapp項(xiàng)目: 大家可以看下兩種方式搭建的項(xiàng)目文件夾目錄有什么區(qū)別,上面的是HbuilderX模版搭建的小程序項(xiàng)目,下面的是cli搭建的項(xiàng)目,先把my-test項(xiàng)目中src下面的文件全部刪除,然后我把小程序代碼全部塞進(jìn)了src文件夾下

    2024年02月16日
    瀏覽(37)
  • 使用npm install -g @vue/cli 命令安裝最新的腳手架與Vue版本不匹配的問(wèn)題

    使用npm install -g @vue/cli 命令安裝最新的腳手架與Vue版本不匹配的問(wèn)題

    使用npm install -g @vue/cli 命令安裝最新的腳手架 創(chuàng)建項(xiàng)目時(shí)不要選擇Vue版本,讓它默認(rèn)選擇(默認(rèn)選擇 Vue2)否則會(huì)出現(xiàn) vue版本和腳手架版本vue-cli 不兼容的問(wèn)題(怪哉) 腳手架兼容vue2 不兼容vue3 ? 不理解,記錄一下,后續(xù)整理 Vue-cli版本 vue 版本 創(chuàng)建項(xiàng)目時(shí) ,選擇默認(rèn)不要

    2024年02月12日
    瀏覽(86)
  • 三、創(chuàng)建腳手架和腳手架分析

    三、創(chuàng)建腳手架和腳手架分析

    1、安裝node.js **下載地址:**https://nodejs.org/zh-cn/ 界面展示 2、檢查node.js版本 查看版本的兩種方式 node -v node -version 出現(xiàn)版本號(hào)則說(shuō)明安裝成功(最新的以官網(wǎng)為準(zhǔn)) 3、為了提高我們的效率,可以使用淘寶的鏡像源 輸入: npm install -g cnpm --registry=https://registry.npm.taobao.org 即可安

    2024年02月22日
    瀏覽(25)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包