internal/licenses: create the Scanner lazily

It takes about 8 seconds to create, so avoid doing it at program
startup.

Change-Id: I7f5837e6eba695d74eafbff22719e7cdec24b8f5
Reviewed-on: https://go-review.googlesource.com/c/pkgsite/+/284236
Trust: Jonathan Amsterdam <jba@google.com>
Run-TryBot: Jonathan Amsterdam <jba@google.com>
Reviewed-by: Julie Qiu <julie@golang.org>
diff --git a/internal/licenses/licenses.go b/internal/licenses/licenses.go
index e40d986..4b4d310 100644
--- a/internal/licenses/licenses.go
+++ b/internal/licenses/licenses.go
@@ -28,6 +28,7 @@
 	"path/filepath"
 	"sort"
 	"strings"
+	"sync"
 
 	"github.com/google/licensecheck"
 	oldlicensecheck "github.com/google/licensecheck/old"
@@ -264,14 +265,20 @@
 	return lics
 }
 
-var scanner *licensecheck.Scanner
+var (
+	_scanner    *licensecheck.Scanner
+	scannerOnce sync.Once
+)
 
-func init() {
-	var err error
-	scanner, err = licensecheck.NewScanner(append(exceptionLicenses, licensecheck.BuiltinLicenses()...))
-	if err != nil {
-		log.Fatalf(context.Background(), "licensecheck.NewScanner: %v", err)
-	}
+func scanner() *licensecheck.Scanner {
+	scannerOnce.Do(func() {
+		var err error
+		_scanner, err = licensecheck.NewScanner(append(exceptionLicenses, licensecheck.BuiltinLicenses()...))
+		if err != nil {
+			log.Fatalf(context.Background(), "licensecheck.NewScanner: %v", err)
+		}
+	})
+	return _scanner
 }
 
 // A Detector detects licenses in a module and its packages.
@@ -483,7 +490,7 @@
 	if logf == nil {
 		logf = func(string, ...interface{}) {}
 	}
-	cov := scanner.Scan(contents)
+	cov := scanner().Scan(contents)
 	if cov.Percent < float64(coverageThreshold) {
 		logf("%s license coverage too low (%+v), skipping", filename, cov)
 		return []string{unknownLicenseType}, cov