Closed3
LICENSE ファイルを探してライセンスを表示する
なんか依存パッケージのライセンスが変えられたみたいな話を聞いて。
実は
という 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 というパッケージもあるのだが,まだアルファ版みたいなので,今回はスルーで(笑)
拙作の spiegel-im-spiegel/depm でモジュール単位にライセンス情報を表示できるようにした。
よーし,うむうむ,よーし。
手元の開発環境では上手く行くのに GoReleaser でビルドしたものを動かすと panic で落ちる。 google/licenseclassifier パッケージの中でコケてるのでどうしようもない。応急手当として google/licenseclassifier パッケージの中で panic が起きても無視することにした。
良くないけど背に腹は替えられない,ということで。理由が分かったらブログ記事にするかな。
このスクラップは2021/04/01にクローズされました