HelloWood

Go 开发命令行工具-OSS文件上传

2019-09-08

使用 Go 开发命令行工具-OSS 文件上

使用 Go 语言开发一个命令行工具,用于向 OSS 文件上传文件
命令行工具有很多框架,选择使用 Cobra

准备

  • 安装 Cobra
1
go get -u github.com/spf13/cobra/cobra

初始化项目

  • 创建项目
1
2
3
4
cd $GOPATH/src
mkdir oss
cd oss
cobra init --pkg-name oss

此时,已经创建了一个 oss 的目录,里面已经包含一个 root 命令

1
2
3
4
5
6
7
.
├── LICENSE
├── cmd
│ └── root.go
└── main.go

1 directory, 3 files

运行 go run main.go查看root 命令

1
2
3
4
5
6
7
go run main.go
A longer description that spans multiple lines and likely contains
examples and usage of using your application. For example:

Cobra is a CLI library for Go that empowers applications.
This application is a tool to generate the needed files
to quickly create a Cobra application.
  • 添加 mod

添加mod 是为了更方便的管理依赖,module 设置 GitHub 是为了安装方便

1
2
export GO111MODULE=on
go mod init github.com/helloworlde/oss

同时需要改下 mian.go中的包名,由oss/cmd改为 github.com/helloworlde/oss/cmd,如果是在GoLand 这样的 IDE 中,还需要启用Enable Go Modules (vgo) integration

添加命令

  • 添加一个 Upload 命令
1
cobra add upload

此时,会在 cmd/下新建一个upload.go的文件,包含基本的运行 upload 命令的代码

1
2
3
go run main.go upload

upload called

upload.go中添加相应的逻辑,具体可以参考 getting-started

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
var uploadCmd = &cobra.Command{
Use: "upload [file]",
Short: "Upload file to OSS",
Long: ``,
Args: func(cmd *cobra.Command, args []string) error {
if len(args) < 1 {
return errors.New("requires at least one file path")
}
return nil
},
Run: func(cmd *cobra.Command, args []string) {
dir := cmd.Flag("directory").Value.String()
picture := cmd.Flag("picture").Value.String()
markdown := cmd.Flag("markdown").Value.String()

if !util.ValidateConfig(ossConfig) {
os.Exit(1)
}

bucket := util.InitBucket(ossConfig)
util.UploadFile(ossDir, path, ossConfig, *bucket)
},
}

func init() {
rootCmd.AddCommand(uploadCmd)

uploadCmd.Flags().StringP("directory", "d", "", "Dictionary of upload file")
uploadCmd.Flags().BoolP("picture", "p", true, "Upload to Picture folder")
uploadCmd.Flags().BoolP("markdown", "m", false, "Print link as Markdown")
}

发布

先将代码上传到 GitHub,然后可以通过 goreleaser 这个工具来发布;需要注意的是,Repo 的名字要和 Module 一致,否则会在安装时提示 Module 不匹配

安装配置 goreleaser

  • 安装
1
brew install goreleaser
  • 配置

goreleaser 发布时需要使用 GitHub 的 Token,然后需要将 GitHub Token 添加到环境变量中

1
export GITHUB_TOKEN=`YOUR_GITHUB_TOKEN`

发布

  • 项目中添加 goreleaser 配置
1
goreleaser init
  • 添加Tag
1
2
git tag -a v0.0.1 -m "First release"
git push origin v0.1.0
  • 发布
1
goreleaser --rm-dist

待上传完成后就可以在 GitHub Release 页面看到刚才发布的版本

oss-tool.png

使用

安装

1
go get -u github.com/helloworlde/oss

使用

  • 上传文件
1
oss upload oss-tool.png
  • 上传到指定文件夹
1
oss upload oss-tool.png -d images/png
  • 上传文件夹
1
oss upload ./cmd -d cmd
  • 上传图片到指定文件夹
1
oss upload oss-tool.png -p
  • 上传图片后输出 Markdown 格式
1
oss upload oss-tool.png -p -m

GitHub

https://github.com/helloworlde/oss