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를 추가했다.packagesgolang.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

좋은 웹페이지 즐겨찾기