An error will happen when upgrading libraries godbus/dbus and coreos/go-systemd:
For example----
github.com/godbus/dbus
-Latest Version: v5.0.3 (Latest commit 37bf87e on 30 Sep 2019)
-Where did you use it:
https://github.com/snapcore/snapd/search?p=1&q=godbus%2Fdbus&unscoped_q=godbus%2Fdbus
-Detail:
module github.com/godbus/dbus/v5
go 1.12
package introspect
import (
"github.com/godbus/dbus/v5"
…
)
This problem was introduced since godbus/dbus commit dda416a on 4 Sep 2019 . Now you used the version commit 4481cbc on 26 Jul 2019 . If you try to upgrade coreos/go-systemd to version commit dda416a on 4 Sep 2019 and above, you will get an error— no package exists at "github.com/godbus/dbus/v5"
Similar issues can also happen when upgrading libraries github.com/coreos/go-systemd.
I investigated the libraries’ (godbus/dbus and coreos/go-systemd) release information and found the root cause of this issue is that----
-
These dependencies all added Go modules in the recent versions.
-
They all comply with the specification of “Releasing Modules for v2 or higher” available in the Modules documentation. Quoting the specification:
A package that has migrated to Go Modules must include the major version in the import path to reference any v2+ modules. For example, Repo github.com/my/module migrated to Modules on version v3.x.y. Then this repo should declare its module path with MAJOR version suffix “/v3” (e.g., module
github.com/my/module/v3
), and its downstream project should use"github.com/my/module/v3/mypkg"
to import this repo’s package.
- This “github.com/my/module/v3/mypkg” is not the
physical path
. So earlier versions of Go (including those that don’t have minimal module awareness) plus all tooling (like dep, glide, govendor, etc) don’t haveminimal module awareness
as of now and therefore don’t handle import paths correctly See golang/dep#1962, golang/dep#2139.
Note: creating a new branch is not required. If instead you have been previously releasing on master and would prefer to tag v3.0.0 on master, that is a viable option. (However, be aware that introducing an incompatible API change in master can cause issues for non-modules users who issue a go get -u given the go tool is not aware of semver prior to Go 1.11 or when module mode is not enabled in Go 1.11+).
Pre-existing dependency management solutions such as dep currently can have problems consuming a v2+ module created in this way. See for example dep#1962.
https://github.com/golang/go/wiki/Modules#releasing-modules-v2-or-higher
Suggested solutions
1. Migrate to Go Modules.
Go Modules is the general trend of ecosystem, If you want a better upgrade package experience, migrating to Go Modules is a good choice.
2. Keep using the dependency manage tool (like dep, glide, govendor, etc).
Because the import paths have different meanings between the projects adopting module mechanism and the non-module mechanism.
-
https://github.com/golang/go/wiki/Modules#semantic-import-versioning
-
https://golang.org/cmd/go/#hdr-Module_compatibility_and_semantic_versioning
-
https://github.com/golang/go/wiki/Modules#releasing-modules-v2-or-higher
If you prefer to use the dependencies manage tool (like dep, glide, govendor, etc), a textbook example provided by repo github.com/moby/moby
can prevent this type of issues.
https://github.com/moby/moby/blob/master/VENDORING.md
https://github.com/moby/moby/blob/master/vendor.conf
In the vendor directory, github.com/moby/moby
adds the /vN subdirectory in the corresponding dependencies.
This will help more downstream modules to work well with your package, otherwise they will be stuck in github.com/coreos/go-systemd v21 and github.com/godbus/dbus v4.1.0.
Do you plan to solve this issue? Which solution do you prefer, 1 or 2?
I can submit a PR to fix it.
Hope this issue report can help you
Thank you very much for your attention.
Best regards,
Kate