0%

goss - 一个简洁的对象存储库

goss: https://github.com/eleven26/goss

背景

一开始写这个东西只是为了写一个命令行工具,拿来将阿里云的 OSS 作为自己的一个临时的云盘,可以通过命令行上传下载一些文件。 当然可能有人会问那么多云盘为什么不用,简单来说就是觉得这些云盘用起来有点麻烦,你要打开网页或者打开客户端,我是大概是一个懒惰的人,只想省去这些繁琐的操作。 另外,这些云盘普遍有个特点就是上传下载速度往往比较慢,但用 OSS 来存储可以有一个较快的下载速度,只是会产生费用。

Goss 的优势

  • 支持常见的对象存储:阿里云 OSS、腾讯云 COS、七牛云 kodo、华为云 OBS。
  • 完善的测试:有完善的单元测试、集成测试。
  • 容易使用的接口:通过 storage.Put 等方式就可以上传下载文件,隐藏了繁琐的细节。
  • 易扩展:实现了 Storage 接口即可。

Goss 提供的接口

goss 目前提供了常用的一些接口:

这些接口覆盖了我的需要了,所以目前就只提供了这些接口;

Put

上传文件到云存储。第一个参数是 key,第二个参数是 io.Reader

1
2
3
data := []byte("this is some data stored as a byte slice in Go Lang!")
r := bytes.NewReader(data)
err := storage.Put("test/test.txt", r)

PutFromFile

上传文件到云存储。第一个参数是 key,第二个参数是本地文件路径。

1
err := storage.PutFromFile("test/test.txt", "/path/to/test.txt")

Get

从云存储获取文件,返回字符串。参数是 key。返回值是 io.ReadClosererror

1
2
3
4
5
6
// rc 是 `io.ReadCloser`
rc, err := storage.Get("test/test.txt")
defer rc.Close()

bs, err := ioutil.ReadAll(rc)
fmt.Println(string(bs))

GetString

从云存储获取文件,返回字符串。参数是 key。返回值是 stringerror

1
2
content, err := storage.GetString("test/test.txt")
fmt.Println(content)

GetBytes

从云存储获取文件,返回字符串。参数是 key。返回值是 []byteerror

1
2
bs, err := storage.Get("test/test.txt")
fmt.Println(string(bs))

GetToFile

下载云存储文件到本地。第一个参数是 key,第二个参数是本地路径。

1
2
// 第一个参数是云端路径,第二个参数是本地路径
err := storage.GetToFile("test/test.txt", "/path/to/local")

Delete

删除云存储文件。

1
err := storage.Delete("test/test.txt")

Exists

判断云存储文件是否存在。

1
exists, err := storage.Exists("test/test.txt")

Files

根据前缀获取文件列表。

1
exists, err := storage.Files("test/")

Size

获取云存储文件大小。

1
size, err := storage.Size("test/test.txt")

goss-cli

正如本文一开始说的,其实一开始是想做一个命令行工具的,最后写成了一个类库。

但是我的命令行工具也是存在的,从 goss 里面拆分出去了,成了 goss-cli

当然功能也是比较简单,但是也足够了,下面是一些示例:

help:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
➜ goss -h
Usage:
[command]

Available Commands:
completion Generate the autocompletion script for the specified shell
debug 调试命令
get 获取指定文件
help Help about any command
list 列出指定目录下的文件
put 上传文件

Flags:
-h, --help help for this command

Use " [command] --help" for more information about a command.

list:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
➜ goss list mac/
Size LastModified Key
0B 2018-06-18 00:13:24 mac/
452.2MB 2020-11-28 06:09:25 mac/Command_Line_Tools_for_Xcode_12.2.dmg
2.0MB 2018-06-18 01:04:39 mac/Go2Shell.dmg
135.3MB 2018-06-18 00:59:00 mac/Navicat Premium 12.0.23.dmg
155.0MB 2020-11-05 00:22:48 mac/Navicat Premium_15.0.20.dmg
1.2GB 2018-06-18 00:34:39 mac/Office 2016 for Mac 多国语言大客户版.dmg
31.0MB 2018-06-18 01:28:06 mac/Sketch49.dmg
16.0MB 2018-06-18 01:28:31 mac/Tunnelblick_3.7.6beta03_build_5031.dmg
69.5MB 2018-06-18 00:55:53 mac/googlechrome-67.0.3396.87.dmg
6.7MB 2018-06-18 01:04:45 mac/iTerm2-3_1_6.zip
13.0MB 2018-06-18 01:04:57 mac/mindnodexx.zip
43.5MB 2018-06-18 01:27:09 mac/privatetunnel-mac-2.8.dmg
459.2MB 2018-12-28 01:03:48 mac/vmware fushion.zip

get:

1
2
3
4
5
➜ goss get mac/Go2Shell.dmg
下载成功!保存路径:"Go2Shell.dmg"

➜ ls -lh Go2Shell.dmg
-rw-r--r-- 1 ruby staff 1.9M Aug 25 09:10 Go2Shell.dmg