diff --git a/build/ci.go b/build/ci.go
index 31c4885a371367d7b57d3945dbd2b0f7b87a5de5..152c86d1b1a432f1434099a124718f5aabe200d7 100644
--- a/build/ci.go
+++ b/build/ci.go
@@ -289,27 +289,29 @@ func doTest(cmdline []string) {
 		build.MustRun(goTool("vet", packages...))
 	}
 	if *misspell {
-		// The spell checker doesn't work on packages, gather all .go files for it
-		sources := []string{}
+		// Ensure the spellchecker is available
+		build.MustRun(goTool("get", "github.com/client9/misspell/cmd/misspell"))
+
+		// Windows (AppVeyor) chokes on long argument lists, check packages individualy
 		for _, pkg := range packages {
-			// Gather all the source files of the package
+			// The spell checker doesn't work on packages, gather all .go files for it
 			out, err := goTool("list", "-f", "{{.Dir}}{{range .GoFiles}}\n{{.}}{{end}}{{range .CgoFiles}}\n{{.}}{{end}}{{range .TestGoFiles}}\n{{.}}{{end}}", pkg).CombinedOutput()
 			if err != nil {
 				log.Fatalf("source file listing failed: %v\n%s", err, string(out))
 			}
 			// Retrieve the folder and assemble the source list
 			lines := strings.Split(string(out), "\n")
-
 			root := lines[0]
+
+			sources := make([]string, 0, len(lines)-1)
 			for _, line := range lines[1:] {
 				if line = strings.TrimSpace(line); line != "" {
 					sources = append(sources, filepath.Join(root, line))
 				}
 			}
+			// Run the spell checker for this particular package
+			build.MustRunCommand(filepath.Join(GOBIN, "misspell"), append([]string{"-error"}, sources...)...)
 		}
-		// Download the spell checker tool and run on all source files
-		build.MustRun(goTool("get", "github.com/client9/misspell/cmd/misspell"))
-		build.MustRunCommand(filepath.Join(GOBIN, "misspell"), append([]string{"-error"}, sources...)...)
 	}
 	// Run the actual tests.
 	gotest := goTool("test")