Description
I realise that the point of go list
is to list packages, and I realise that one must generally obey build constraints when loading packages. For example, it makes no sense to try to type-check all the Go files in a package while ignoring build constraints, because there will likely be duplicate definition errors if declarations are split by GOOS
or GOARCH
.
Having said that, it can be very useful to merely list or traverse a set of packages in a way that build constraints are completely ignored. The most common use case is: what packages are potentially imported by the current package, directly or indirectly, across all build configurations?
This question is valid, for example, if one wants to copy a package and all of its transitive package dependencies. go list -deps <package>
does not work in general, because if I run the command on Linux, I would not be including imports which are only used on Windows.
The closest thing we have right now is go mod vendor
, which copies all transitively imported packages by all the packages in the current module into the vendor folder, across all build constraints. So cmd/go
already has the machinery to traverse a package dependency graph while ignoring build constraints, it seems.
--
Here ends the problem statement, and begins my initial suggestion for a solution: a go list
flag to ignore build constraints. Here are some example use cases:
-
List all the packages potentially depended on by a given package:
go list -deps -newflag <package>
-
List all the packages under the current directory tree, not just for the current platform:
go list -newflag ./...
I'm not sure what this new flag could be called. Perhaps -nobuild
or -anybuild
.
The flag would also restrict what go list
can do. For example, using -newflag
along with -export
or -compiled
would be an error, because it does not make sense to load/build packages when we're ignoring build constraints. Similarly, -newflag -json
would always omit some fields like IgnoredGoFiles
, since they make sense only when following build constraints.
This idea has been discussed briefly before, but as far as I know no problem statement or solution has been raised as an issue yet. I'm not using a proposal title and label; as far as I know that's only necessary if we need the proposal review committee to intervene.
cc @bcmills @jayconrod @matloob @rsc for cmd/go
cc @ianthehat @dominikh @myitcv @rogpeppe @kardianos for golang-tools and some previous issues