Closed3

LICENSE ファイルを探してライセンスを表示する

なんか依存パッケージのライセンスが変えられたみたいな話を聞いて。

実は

https://github.com/google/go-licenses

という Go パッケージというかツールがあるのだが,中身が微妙なのでそのままスルーしていた。でも,まぁ,そういうツールはあった方がいいと思うので,上のパッケージを簡略化したサンプルコードを挙げておく。

package main

import (
    "fmt"
    "os"
    "path/filepath"
    "regexp"

    "github.com/google/licenseclassifier"
)

var licenseRegexp = regexp.MustCompile(`^(?i)(LICEN(S|C)E|COPYING|README|NOTICE)(\..+)?$`)

func findLicense(dir string, classifier *licenseclassifier.License) (string, string) {
    files, err := os.ReadDir(dir)
    if err != nil {
        return "", ""
    }
    for _, f := range files {
        if licenseRegexp.MatchString(f.Name()) {
            path := filepath.Join(dir, f.Name())
            if content, err := os.ReadFile(path); err == nil {
                matches := classifier.MultipleMatch(string(content), true)
                if len(matches) > 0 {
                    return path, matches[0].Name
                }
            }
        }
    }
    return "", ""
}

func main() {
    classifier, err := licenseclassifier.New(licenseclassifier.DefaultConfidenceThreshold)
    if err != nil {
        fmt.Fprintln(os.Stderr, err)
        return
    }
    path, license := findLicense(".", classifier)
    fmt.Println(path, ":", license)
}

これでカレントディレクトリに LICENSE ファイルを置いて実行すると

$ go run sample.go
LICENSE : MIT

という結果になる。キャッシュファイルでもローカルに実体があれば読めるだろう。あとはよしなにw

ちなみに github.com/google/licenseclassifier/v2 というパッケージもあるのだが,まだアルファ版みたいなので,今回はスルーで(笑)

手元の開発環境では上手く行くのに GoReleaser でビルドしたものを動かすと panic で落ちる。 google/licenseclassifier パッケージの中でコケてるのでどうしようもない。応急手当として google/licenseclassifier パッケージの中で panic が起きても無視することにした。

https://github.com/spiegel-im-spiegel/depm/releases/tag/v0.4.3

良くないけど背に腹は替えられない,ということで。理由が分かったらブログ記事にするかな。

このスクラップは2021/04/01にクローズされました
ログインするとコメントできます