A sidenote is that there seems to always be issues with using kubernetes client. Is it structured very un Go-ish?
Very nice writeup! NB: I was also hit by the casing issue with the same viper dependency. fre 23 feb. 2018 kl 08:28 skrev David Anderson <d...@natulte.net>: > I should add: even though I spent several hours working through these > issues, I feel very happy about the process and outcome. I have high > confidence that I understand what vgo is doing with my module spec, and > that I know how to tweak its thinking in future. I would contrast this with > my experience with Glide. Last weekend, I tried to `glide up` this same > project, and spent 4 hours trying to resolve the resulting mayhem of > diamond dependencies and build errors. I failed, rolled back the change, > and decided MetalLB could stay on old code for a while longer. I still have > very low confidence that I understand what glide will do when I `glide up`, > or that it will produce a working result. > > Additionally, some of the time spent is likely the learning curve. As > https://github.com/golang/go/issues/24032 illustrates, I was initially > confused and had to re-read some of rsc's writing to formulate my plan of > action. Despite that, I still spent less time end to end than with glide, > and I had a working build at the end of it. > > - Dave > > On Thu, Feb 22, 2018 at 11:20 PM, David Anderson <d...@natulte.net> wrote: > >> This is an experience report onboarding vgo for a relatively complex >> project (multiple binaries, vast import tree, tricky unidiomatic imports). >> I leave it here in the hopes that it guides other people, and potentially >> illustrates places where vgo falls short of great. TL;DR it went pretty >> well, modulo a couple of UX speed bumps. >> >> The result is the `vgo-test` branch of https://github.com/google/metallb/ >> . Cloning that repository should allow you to `vgo test ./...`, `vgo build >> ./controller`, `vgo build ./speaker`, and a few others. I don't make any >> representation that the code does what it should, merely that it builds and >> passes tests. >> >> The resultant go.mod, >> https://github.com/google/metallb/blob/vgo-test/go.mod , is quite messy. >> This is mostly due to the number of dependencies that have no semver at >> all, forcing vgo to use commit hash "versions". The result is a lot of >> visual noise in the file, but hopefully that will improve over time as both >> vgo and dep nudge people towards semver releases. >> >> I encountered two major roadblocks on the road to `vgo test ./...`: the >> Kubernetes client library, and mixed case packages. These are >> https://github.com/golang/go/issues/24032 and >> https://github.com/spf13/jWalterWeatherman/issues/22 respectively. >> >> >> The Kubernetes client library is a worst case scenario for vgo. It >> releases a new major version every 3 months under the same module name, >> with real incompatibilities between versions; and it relies extensively on >> a transitive version lock to force a specific package selection on its >> dependents. Making this library usable from vgo required the following: >> >> - Fix up client-go in a fork >> - Fork github.com/kubernetes/client-go to >> github.com/danderson/client-go >> - Add a go.mod to the fork, containing only: module " >> k8s.io/client-go/v6" >> - Update all internal self-references within client-go: perl -pi >> -e 's#"k8s.io/client-go#"k8s.io/client-go/v6#g' **/*.go >> - Commit the result, >> >> https://github.com/danderson/client-go/commit/7d8481153a9edbf8eacc176ce29f8d58949c3a77 >> . Tag as v0.0.0-vgo-prototype-compat and push. >> - Make my repository use my fork of client-go: >> - Update all uses of client-go to the new versioned package name: perl >> -pi -e 's#"k8s.io/client-go#"k8s.io/client-go/v6#g' **/*.go >> - Require the right version in mod.go: require "k8s.io/client-go/v6" >> v6.0.0 >> - Replace upstream with my fork in mod.go: replace " >> k8s.io/client-go/v6" v6.0.0 => "github.com/danderson/client-go" >> v0.0.0-vgo-prototype-compat >> >> I'm curious how we could upstream the changes I had to make to client-go. >> I had to rename module-internal imports, which will break existing non-vgo >> uses of the library, but vgo offers no alternative to this renaming that >> I'm aware of. It looks to me like there's no graceful upgrade path for this >> module. The repo structure works either for pre-vgo clients, or for vgo, >> but not both at once. >> >> The UX was lacking to explain the reason for failures, before I made any >> of the changes. Given just my repository, vgo inferred that I wanted v1.5.2 >> of client-go (3+ years old), continued resolving dependencies, and >> eventually barfed when it found an import for a client-go subpackage that >> didn't exist in 1.5.2. The error was simply a bunch of "no such file or >> directory", and required some head-scratching to understand what had >> happened. Once I understood why vgo was making that decision, and how to >> correct it, vgo provided the right tools (mostly replace-with-fork) to >> correct the issue without waiting on the library to fix itself. >> >> >> The second issue I hit is github.com/spf13/jwalterweatherman. The actual >> repository name in github is "jWalterWeatherman", but everyone (including >> the package's author :) ) imports it lowercase. vgo disallows this casing >> mismatch. >> >> To solve that, I just added a require + replacement to "fix" the >> case: replace "github.com/spf13/jwalterweatherman" >> v0.0.0-20180109140146-7c0cea34c8ec => "github.com/spf13/jWalterWeatherman" >> v0.0.0-20180109140146-7c0cea34c8ec >> >> The version to use in that replacement was hard to come by. Since vgo was >> unable to compute the right dependency list without this replacement, it >> bailed without giving me any version I might use. The date+hash format is >> irritating to construct by hand, but could be trivially lifted into a tool >> (perhaps even vgo itself). Instead, I opted to create a separate dummy >> module, with a dummy main.go that imported and used the camelCased package, >> and run vgo on that. This produced a tiny go.mod with a constructed commit >> hash version, which I then used in MetalLB's go.mod. It would have been >> nice for vgo to help me a bit more there. >> >> - Dave >> >> >> >> On Tue, Feb 20, 2018 at 9:20 AM, Russ Cox <r...@golang.org> wrote: >> >>> Hi everyone, >>> >>> I have a new blog post you might be interested in. >>> https://research.swtch.com/vgo. >>> >>> I'll try to watch this thread to answer any questions. >>> >>> Best, >>> Russ >>> >>> >>> >>> -- >>> You received this message because you are subscribed to the Google >>> Groups "golang-nuts" group. >>> To unsubscribe from this group and stop receiving emails from it, send >>> an email to golang-nuts+unsubscr...@googlegroups.com. >>> For more options, visit https://groups.google.com/d/optout. >>> >> >> > -- > You received this message because you are subscribed to the Google Groups > "golang-nuts" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to golang-nuts+unsubscr...@googlegroups.com. > For more options, visit https://groups.google.com/d/optout. > -- You received this message because you are subscribed to the Google Groups "golang-nuts" group. To unsubscribe from this group and stop receiving emails from it, send an email to golang-nuts+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.