wire icon indicating copy to clipboard operation
wire copied to clipboard

Due to the circular dependency, the wire cannot be generated, but the corresponding variable cannot be found when the error is reported.

Open groot-guo opened this issue 4 years ago • 1 comments

Describe the bug

If I am in the following apps directory structure in app1 package, app.go

package app1

import (
	"awesomeProject/wire_test/app"
	"fmt"
)

type A struct {
	C *app.C
}

func (a *A) Add(b app.B) {
	fmt.Println(b)
}

in wire package , wire.go

//go:build wireinject
// +build wireinject

package wire

import (
	"awesomeProject/wire_test/app"
	"awesomeProject/wire_test/app/app1"

	"github.com/google/wire"
)

func Inject() *app.B {
	wire.Build(
		wire.Struct(new(app1.A), "*"),
		wire.Struct(new(app.B), "*"),
		wire.Struct(new(app.C), "*"),
	)
	return nil
}

in intance.go

package app

import "awesomeProject/wire_test/app/app1"

type B struct {
	A app1.A
}

type C struct {
}

As a result, the following error was reported. In fact, it should be a circular reference that caused the wire to fail to be generated

wire: /Users/genyuanguo/Desktop/awesomeProject/wire_test/app/wire/wire.go:13:1: inject Inject: no provider found for *invalid type
        needed by awesomeProject/wire_test/app/app1.A in struct provider "A" (/Users/genyuanguo/Desktop/awesomeProject/wire_test/app/app1/app.go:8:6)
        needed by *awesomeProject/wire_test/app.B in struct provider "B" (/Users/genyuanguo/Desktop/awesomeProject/wire_test/app/intance.go:5:6)
wire: awesomeProject/wire_test/app/wire: generate failed
wire: at least one generate failure

To Reproduce

. └── app |── app1 │   └── app.go |── intance.go └── wire |── wire.go └── wire_gen.go If you use the wire directory structure like this

Expected behavior

Should report an error app1 and app circular reference.

Version

github.com/google/wire v0.5.0

Additional context

Add any other context about the problem here.

groot-guo avatar Sep 10 '21 06:09 groot-guo

I think I have a similar issue. I'm seeing wire flip flopping between success and failure - and giving a cryptic error message:

$ wire ./apps/agent
wire: apps/agent: wrote <...>/apps/agent/wire_gen.go
$ wire ./apps/agent
wire: <...>/apps/agent/t_serverbuild.go:36:26: cannot use a.Context() (value of type *engine.Context) as *invalid type value in argument to a.WebsocketWrite

I narrowed it down to a circular dependency that didn't actually occur when compiling the project the regular way (ie without the wireinject tag).

I solved this now by running go build -tags wireinject <directory with wire.go> first.

stephanos avatar Oct 16 '21 19:10 stephanos