-
Notifications
You must be signed in to change notification settings - Fork 17.7k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
cmd/go: add 'go get' options to update direct and indirect dependencies separately #28424
Comments
Great proposal! I just asked a related question in the Gopher Slack channel regarding how to update only my direct dependencies and use the indirect dependencies they require, because of fear of subtle changed behavior in latest indirect v0.x dependencies and got pointed to this issue. I would love to see something like this in Go 1.14! In case the Slack discussion is of any interest: https://gophers.slack.com/archives/C9BMAAFFB/p1570822899096300 |
For what it's worth, I haven't found the original issue's module=$(go list -f '{{.Module.Path}}' .)
go mod tidy
go get -d -t $(go mod graph | grep "^$module" | cut -d ' ' -f 2 | sed 's/@.*/@upgrade/g')
go mod tidy
go mod download Which uses Just to show what the difference is on one of my projects:
All of which are things that my non-module-aware dependencies require themselves but are not satisfied elsewhere. |
I would love to see this implemented! Sometimes, when updating dependencies for a project with this snippet:
has been really handy, and made the process of keeping projects up to date very easy. It would be nice for this to be a feature integrated in the CLI itself. |
An experience report on this front. I have a dep on
In order to upgrade my deps (not knowing about the other workaround in this issue), I have been using this script to do them one at a time:
And then I manually copy over the known good gvisor package version from the Being able to easily upgrade only the direct dependencies would be a big help in this situation. |
* upgrade library code (renamed to openai) * update depenencies (see https://github.com/golang/go/issues/28424\#issuecomment-1101896499) * fix breaking changes in scorecard * fix breaking changes in gitlab client * pin codesee to a functioning version --------- Co-authored-by: Charlton Trezevant <7227500+chtzvt@users.noreply.github.com> Co-authored-by: noamd <noam@legitsecurity.com>
What version of Go are you using (
go version
)?1.11.1
Summary
Users have more familiarity with their direct dependencies than their indirect dependencies. Indirect dependencies can also be larger in number, with greater potential combinations of pair-wise versions.
For these and other reasons, upgrading direct dependencies has a different risk profile than upgrading indirect dependencies.
Therefore:
This might result in upgrade strategies that retain more benefits of 'High-Fidelity Builds', especially as compared to doing a simple
go get -u
orgo get -u=patch
.Regardless of whether or not this particular suggestion ends up making sense, a more general goal would be to have a small basket of easy-to-run upgrade strategies that could be applied to something like 80-90% of projects.
Background
The "Update Timing & High-Fidelity Builds" section of the official proposal includes:
This is a very nice set of properties of the overall modules system, and is materially different than a more traditional approach.
That section later goes on to say:
Issue
The initial starting point for a new set of dependencies in the modules system is more conservative than a more traditional approach, and as a result it is likely the case that you have better odds of starting with a working system. The ability to easily do
go get -u
to update all direct and indirect dependencies helps balance out that more conservative start.However, once you do
go get -u
, you have stepped away to some degree from some of the benefits of "High-Fidelity Builds" at that point in time.The same is true of
go get -u=patch
, though the step away is smaller.Suggestion
Consider some form of providing for an easy upgrade just to direct dependencies.
Setting aside the actual mechanics (e.g., new flag vs. some other mechanism), if you could easily ask for to get the latest versions of your direct dependencies, e.g., via something like:
...or less likely, perhaps that same sentiment could be written something like:
...or some other form that would ask to upgrade only your direct dependencies to the latest version available. That would mean in the common case the resulting versions for your indirect dependencies would be the ones listed in a
require
directive by at least one of your other dependencies, which would preserve many of the benefits of 'High-Fidelity Builds'.In contrast, a simple
go get -u
often moves your indirect dependencies to versions beyond the versions listed in anyrequire
directive, and hence you might be using versions of modules that the module's importer in your build has never used or tested, or you otherwise might find yourself in a rare combination of versions involving indirect dependencies.The author of the top-level build:
For the rest of this write-up, we'll use
go get -u -directonly
as the strawman form (rather thango get direct@latest
).go get -u -directonly
or similar could be viewed as a 'high-fidelity upgrade', though that might not be not good terminology.If some form of mechanics for more easily upgrading direct dependencies was adopted, it could apply for patch upgrades as well, such as something like:
...which would update your direct dependencies to their latest patch releases.
In addition, it might make sense to also allow for easily specifying how you want to upgrade your indirect dependencies. If that was allowed, then for some projects a natural strategy for dependency upgrades might be:
That would more conservative than
go get -u
, and slightly more aggressive than the hypotheticalgo get -u -directonly
, but there is some risk mitigation for indirect dependencies by picking up the latest patch versions for indirect dependencies (go get -u=patch -indirectonly
, which admittedly is not a great flag name).Backing up:
require
statements for a module have the true minimum supported version of dependenciesgo get -u -directonly
,go get -u=patch -directonly
,go get -u=patch -indirectonly
could provide simpler and better answers to those questions at least for some projects.Alternatives
I think even today in 1.11 you can emulate the suggested behavior above, though it is not always natural or obvious.
Perhaps there is a simpler way today, but for example given the flexibility of
go list
, I suspect in 1.11 the following gives you thego get -u=patch -indirectonly
behavior described above:To upgrade your direct dependencies to their latest release (the
go get -u -directonly
orgo get direct@latest
behavior described above), this should work in 1.11:go mod edit -json
and similar open up even more doors for greater control today.The text was updated successfully, but these errors were encountered: