wire에서`-:cannot find package "pattern=."하면, 만약, 만약...
13015 단어 Go
TR;DR
golang.org/x/tools
를 2018-10-13 이후 버전으로 업데이트하고 13ebad8 버전으로 구체화하십시오.발단
어느 날, grapi에서.go generate ./...` 집행 후 갑자기 죽었다. wire 모두 실패한 것 같다.
-: cannot find package "pattern=." in any of:
/usr/local/Cellar/go/1.11.1/libexec/src/pattern=. (from $GOROOT)
/Users/izumin/src/pattern=. (from $GOPATH)
wire: generate failed
cmd/grapi-gen-type/di/wire_gen.go:3: running "wire": exit status 1
pattern=.
은(는)조사
당시 와이어의 버전은 사용v0.2.0이었다.
먼저
pattern=
grep을 사용하세요.func load(ctx context.Context, wd string, env []string, patterns []string) ([]*packages.Package, []error) {
cfg := &packages.Config{
Context: ctx,
Mode: packages.LoadAllSyntax,
Dir: wd,
Env: env,
BuildFlags: []string{"-tags=wireinject"},
// TODO(light): Use ParseFile to skip function bodies and comments in indirect packages.
}
escaped := make([]string, len(patterns))
for i := range patterns {
escaped[i] = "pattern=" + patterns[i]
}
pkgs, err := packages.Load(cfg, escaped...)
if err != nil {
return nil, []error{err}
}
internal/wire/parse.go#L332-L348 internal/wire.load
는 코드가 생성될 때 시작되는 함수이다. patterns
에 매개 변수 or.
를 추가했다. 이 각 요소에 pattern=
라고 불리는prefix를 추가했다.packages
은golang.org/x/tools/go/packages, 정태 분석 주위에 쉽게 사용할 수 있도록 포장된 것입니다. 여기도 천천히 "pattern"
등으로grep합니다. // Extract file= and other [querytype]= patterns. Report an error if querytype
// doesn't exist.
extractQueries:
for _, pattern := range patterns {
eqidx := strings.Index(pattern, "=")
if eqidx < 0 {
restPatterns = append(restPatterns, pattern)
} else {
query, value := pattern[:eqidx], pattern[eqidx+len("="):]
switch query {
case "file":
containFiles = append(containFiles, value)
case "pattern":
restPatterns = append(restPatterns, value)
case "name":
packagesNamed = append(packagesNamed, value)
case "": // not a reserved query
restPatterns = append(restPatterns, pattern)
default:
for _, rune := range query {
if rune < 'a' || rune > 'z' { // not a reserved query
restPatterns = append(restPatterns, pattern)
continue extractQueries
}
}
// Reject all other patterns containing "="
return nil, fmt.Errorf("invalid query type %q in query pattern %q", query, pattern)
}
}
}
go/packages/golist.go#L55-L84 - github.com/golang/tools@3c39ce7 파라미터를 해석합니다. 천천히 blame를 하면 10/13 커밋에 파라미터가 추가되었음을 알 수 있습니다.
따라서
golang.org/x/tools
의 버전을 향상시킵니다.잡담
packages
내부에서 두드리기go list
.golist의 내부 설치는 internal입니다.의, 왜 export를 안 해요?
// golistDriverCurrent uses the "go list" command to expand the
// pattern words and return metadata for the specified packages.
// dir may be "" and env may be nil, as per os/exec.Command.
func golistDriverCurrent(cfg *Config, words ...string) (*driverResponse, error) {
// go list uses the following identifiers in ImportPath and Imports:
//
// "p" -- importable package or main (command)
// "q.test" -- q's test executable
// "p [q.test]" -- variant of p as built for q's test executable
// "q_test [q.test]" -- q's external test package
//
// The packages p that are built differently for a test q.test
// are q itself, plus any helpers used by the external test q_test,
// typically including "testing" and all its dependencies.
// Run "go list" for complete
// information on the specified packages.
buf, err := golist(cfg, golistargs(cfg, words))
if err != nil {
return nil, err
}
go/packages/golist.go#L185-L205@13ebad8 - github.com/golang/tools@13ebad8
Reference
이 문제에 관하여(wire에서`-:cannot find package "pattern=."하면, 만약, 만약...), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/izumin5210/items/2613364e29c0e25844aa텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)