バージョン
version, SemVer
公式ではないが、公開されていて利用できるパッケージの情報を記す。
pure GoによるGitライブラリ。
Gitの公式ページでも紹介されている。
インメモリで処理され、コマンドをフォークしないので、gitコマンドをラップして使うよりはいいかもしれない。 ただし、2020-06-02現在、gitコマンドの全てを網羅しているわけではない。
互換性については、 https://github.com/go-git/go-git/blob/master/COMPATIBILITY.md を見るべし。
Tips:
Plain*
関数を使うと、ふつうの git
コマンドに近い使い方ができる(Not インメモリ処理)参考:
https://pkg.go.dev/github.com/go-git/go-git/[email protected]?tab=doc#PlainClone
func PlainClone(path string, isBare bool, o *CloneOptions) (*Repository, error)
ふつうの git clone
コマンドのように使える関数。
Examples:
_, err := git.PlainClone(path, false, &git.CloneOptions{
URL: "https://github.com/git-fixtures/basic.git",
})
if err != nil {
log.Fatal(err)
}
https://pkg.go.dev/github.com/go-git/go-git/[email protected]?tab=doc#PlainOpen
func PlainOpen(path string) (*Repository, error)
Examples:
// path上のリポジトリを開いてgit pull相当の操作を実行
repo, err := git.PlainOpen(path)
wtree, err := repo.Worktree()
err = wtree.Pull(&git.PullOptions{})
https://pkg.go.dev/github.com/go-git/go-git/[email protected]?tab=doc#Repository
リポジトリを表現する型。
https://pkg.go.dev/github.com/go-git/go-git/[email protected]?tab=doc#Repository.Worktree
func (r *Repository) Worktree() (*Worktree, error)
ワーキングツリーを取得する関数。
https://pkg.go.dev/github.com/go-git/go-git/[email protected]?tab=doc#Worktree
gitのワーキングツリーを表す型。
https://pkg.go.dev/github.com/go-git/go-git/[email protected]?tab=doc#Worktree.Pull
func (w *Worktree) Pull(o *PullOptions) error
ワーキングツリー上で git pull
相当の操作を実行。
変更がなければ NoErrAlreadyUpToDate
を返す。
https://github.com/goccy/go-yaml
Yet AnotherなYAMLライブラリ。
参考:
https://pkg.go.dev/github.com/google/go-cmp/cmp
主にテストで使える値の比較のためのライブラリ。
Example:
got, want := MakeGatewayInfo()
if diff := cmp.Diff(want, got); diff != "" {
t.Errorf("MakeGatewayInfo() mismatch (-want +got):\n%s", diff)
}
メモ:
参考:
GitHub APIクライアントライブラリ。
Examples:
client := github.NewClient(nil)
// list all organizations for user "willnorris"
orgs, _, err := client.Organizations.List(ctx, "willnorris", nil)
golang.org/x/oauth2を使うのが簡単。
import "golang.org/x/oauth2"
ctx := context.Background()
ts := oauth2.StaticTokenSource(
&oauth2.Token{AccessToken: "... your access token ..."},
)
tc := oauth2.NewClient(ctx, ts)
client := github.NewClient(tc)
// list all repositories for the authenticated user
repos, _, err := client.Repositories.List(ctx, "", nil)
https://pkg.go.dev/github.com/google/go-github/v32/github?tab=doc#RepositoriesService
func (s *RepositoriesService) GetLatestRelease(ctx context.Context, owner, repo string) (*RepositoryRelease, *Response, error)
GitHub上の最新リリースを取得。
Example:
release, res, err := client.Repositories.GetLatestRelease(ctx, owner, repo)
APIリファレンス: https://developer.github.com/v3/repos/releases/#get-the-latest-release
Examples:
color.Red.Println("Simple to use color")
color.Green.Print("Simple to use color")
color.Cyan.Printf("Simple to use %s\n", "color")
color.Danger.Println("DANGER") // 赤太字
color.Success.Println("SUCCESS") // 緑太字
Hint:
参考:
https://pkg.go.dev/gopkg.in/yaml.v2
GoにおけるYAMLライブラリのデファクト。
参考:
Example:
f, err := os.Open("hello.yml")
if err != nil {
log.Fatal(err)
}
defer f.Close()
d := yaml.NewDecoder(f)
var m map[string]interface{}
if err := d.Decode(&m); err != nil {
log.Fatal(err)
}
fmt.Printf("%v\n", m) // map[name:Tanaka age:30]
https://pkg.go.dev/gopkg.in/yaml.v2?tab=doc#NewDecoder
func NewDecoder(r io.Reader) *Decoder
https://pkg.go.dev/gopkg.in/yaml.v2?tab=doc#Unmarshal
func Unmarshal(in []byte, out interface{}) (err error)
YAMLをデコードしてstructかmapに読み込む。
Examples:
// structに読み込む
type T struct {
F int `yaml:"a,omitempty"`
B int
}
var t T
yaml.Unmarshal([]byte("a: 1\nb: 2"), &t)
// mapに読み込む
var m map[string]interface{}
data := `
name: Tanaka
age: 30
`
yaml.Unmarshal([]byte(data), &m)
fmt.Printf("%v\n", m) //=> map[name:Tanaka age:30]
参考:
https://pkg.go.dev/gopkg.in/yaml.v2?tab=doc#Decoder
func (dec *Decoder) Decode(v interface{}) (err error)
Goでバイナリファイルの種類を識別するためのライブラリ。
アドホックに独自フォーマットを追加することも可能。
対応フォーマット例:
https://github.com/jinzhu/configor
YAML, JSON, TOML, 環境変数に対応した設定ツール。
Usage:
package main
import (
"fmt"
"github.com/jinzhu/configor"
)
var Config = struct {
APPName string `default:"app name"`
DB struct {
Name string
User string `default:"root"`
Password string `required:"true" env:"DBPassword"`
Port uint `default:"3306"`
}
Contacts []struct {
Name string
Email string `required:"true"`
}
}{}
func main() {
configor.Load(&Config, "config.yml")
fmt.Printf("config: %#v", Config)
}
上のコード用のconfig.ymlの例:
appname: test
db:
name: test
user: test
password: test
port: 1234
contacts:
- name: i test
email: [email protected]
各種圧縮形式に対応した人気のパッケージで、CLIとしても、ライブラリとしても利用できる。
各種形式に対応するためかそれなりに依存が多いが、自前で各種形式に対応したくないときは便利に使えそう。
Examples:
// 圧縮形式は拡張子から判別される
err := Unarchive("blog_site.zip", "extracted/mysite")
if err != nil {
log.Fatal(err)
}
unified diffが取れる使いやすいライブラリ。
Pythonのdifflibのポートだそうだ。
※2018年で更新が止まっており、メンテされていない。
Example:
diff := difflib.UnifiedDiff{
A: difflib.SplitLines("foo\nbar\n"),
B: difflib.SplitLines("foo\nbaz\n"),
FromFile: "Original",
ToFile: "Current",
Context: 3,
}
text, _ := difflib.GetUnifiedDiffString(diff)
fmt.Printf(text)
出力:
--- Original
+++ Current
@@ -1,3 +1,3 @@
foo
-bar
+baz
使い方が難しいライブラリ。
DiffPrettyText関数で色付きdiffは出せるのだけど、unified形式のdiffの出し方がわからん。
参考:
標準パッケージ flag の高機能版。
GNUスタイルのロングオプションが作れる。
flagを拡張しているので、flagでできることは基本的にpflagでもできる。
ので、flagについても併せて見ること。
Examples:
import flag "github.com/spf13/pflag"
// Set as pointer
var ip *int
ip = flag.Int("flagname", 1234, "help message for flagname")
// Set as variable
var flagvar int
flag.IntVar(&flagvar, "flagname", 1234, "help message for flagname")
// Custom flags which satifsfy Value interface
flag.Var(&flagVal, "name", "help message for flagname")
// Parse arguments into flags
flag.Parse()
switch flag.NArg() {
case 0:
// 引数なし
case 1:
// 引数1個
default:
// それ以上
}
参考: