@Jason That's really helpful, thanks. I/we adopted Go long after modules were introduced and have never had to deal with GOPATH mode, which probably explains why I didn't read the aspects relating to that (or wiped them from my memory subsequently - lol).
On Friday 19 April 2024 at 02:02:36 UTC+12 Jason Phillips wrote: > @Jolyon > > Is this the correct approach to major-v-bumping a module? > > There are two approaches supported by the Go tooling. This is one of them. > Neither is more correct than the other, there are pros and cons to each. > Using a major version directory has the benefit of working transparently > with GOPATH mode, which may be desirable for some projects. But, it has the > shortcoming, as you pointed out, of making things confusing since multiple > major versions are maintained in the same source tree. > > Here is what the Go mod reference <https://go.dev/ref/mod> has to say: > > > Subdirectories with a major version suffix are major version > subdirectories. They may be used to develop multiple major versions of a > module on a single branch. This may be unnecessary when development of > multiple major versions proceeds on separate branches. However, major > version subdirectories have an important property: in GOPATH mode, package > import paths exactly match directories under GOPATH/src. The go command > provides minimal module compatibility in GOPATH mode (see Compatibility > with non-module repositories <https://go.dev/ref/mod#non-module-compat>), > so major version subdirectories aren’t always necessary for compatibility > with projects built in GOPATH mode. Older tools that don’t support minimal > module compatibility may have problems though. > > @Xiangrong > > Your reply introduced a new aspect: how does the go-get mechanism handle > packages that are not tracked in the master branch of the version control > system? > > When pulling from source control, the go command uses semantic version > tags to pull in the correct version. That means if a module A imports > modules B/v1.w.x and B/v2.y.z, and module B uses "major version > subdirectories", the v1.w.x and v2.y.z versions that are pulled in don't > need to correspond to the same commit in source control. B/v1.w.x and > B/v2.y.z are treated completely independently. It's worth noting that's no > different than how modules which *don't* use "major version > subdirectories" are treated. > > On Wednesday, April 17, 2024 at 9:16:34 PM UTC-4 Xiangrong Fang wrote: > >> As a matter of fact, I gained a somewhat complete understanding of the >> whole concept of Go modules and the go-get facade mechanism through writing >> a simple pkgsvr (https://xrfang.coding.net/public/go/pkgsvr/git/files). >> However, before this issue came up, I hadn't noticed the significance of >> the <meta> tag. :-) >> >> Your reply introduced a new aspect: how does the go-get mechanism handle >> packages that are not tracked in the master branch of the version control >> system? >> >> >> >> >> Jolyon Direnko-Smith <delt...@gmail.com> 于2024年4月18日周四 08:53写道: >> >>> Is this the correct approach to major-v-bumping a module? I had >>> understood the "vN" slug in the module to be a "virtual" element, >>> signalling the deliberate introduction of an upgrade to a new major version >>> of a dependency. i.e. it avoids (or at least makes less likely) the chance >>> of inadvertently taking a dependency on a new version of a module already >>> in use that introduces breaking changes (as usually signalled by a major >>> version bump). >>> >>> i.e. the module ref "host/module/path/v2" is resolved to the repository >>> at "host/module/path". The /vN suffix in an import ref must match the >>> module id in the go.mod at the revision tagged by the version specified in >>> the import. >>> >>> For pre-release versions of a new major version, "pre-release" code >>> module exists in a development branch for that new version, with a version >>> (tag) similar to "v2.0.0-alpha". If someone wishes to import that to >>> experiment with, they need to import (e.g.) >>> "host/module/path/v...@v2.0.0-alpha". Having said that, if the intention >>> is to maintain 1.x and 2.x versions as both "current" then I could see how >>> this v2 folder approach might work, though I struggle then to imagine how >>> one would make sense of tagged versions of the repo (i.e. the tagged >>> "v2.0.0" also contains a "production" release of "v1.?.?") >>> >>> What happens if if a project contains code where some packages use the >>> v1 of an imported module while other packages use v2? >>> >>> With modules using the "/vN" virtual suffix this remains straightforward >>> (I think): each major version is held separately, at the referenced version >>> for that major version, in the mod cache. But if using major version >>> folder, the cached mod for the later major version also contains some >>> version of previous major versions. And the cached mod of earlier major >>> versions may contain pre-release versions of later major versions. Maybe I >>> just need to get my head around it properly, but this feels like it could >>> get confusing (for the wetware - i.e. humans - if not the tooling). >>> >>> >>> This is a genuine question, not intended to criticise the approach but >>> to understand it as - if "official" - it's something I did not come across >>> when researching this issue in the one instance in the past where I needed >>> to bump the major version of a module. >>> On Thursday 18 April 2024 at 03:15:02 UTC+12 Xiangrong Fang wrote: >>> >>>> Yeah. After clean modcache. >>>> >>>> Thanks! >>>> >>>> >>>> >>>> >>>> Jason Phillips <jasonrya...@gmail.com> 于2024年4月17日周三 22:41写道: >>>> >>>>> It works for me, now. >>>>> >>>>> > go get go.xrfang.cn/hap/v...@v2.0.0-alpha.2 >>>>> <http://go.xrfang.cn/hap/v2@v2.0.0-alpha.2> >>>>> go: downloading go.xrfang.cn/hap/v2 v2.0.0-alpha.2 >>>>> go: go.xrfang.cn/hap/v...@v2.0.0-alpha.2 >>>>> <http://go.xrfang.cn/hap/v2@v2.0.0-alpha.2> requires go >= 1.22.1; >>>>> switching to go1.22.2 >>>>> go: upgraded go 1.22.0 => 1.22.1 >>>>> go: added toolchain go1.22.2 >>>>> go: added go.xrfang.cn/hap/v2 v2.0.0-alpha.2 >>>>> >>>>> On Wednesday, April 17, 2024 at 10:31:07 AM UTC-4 Xiangrong Fang wrote: >>>>> >>>>>> Hi Jason, >>>>>> >>>>>> Acutally I wrote the go hosting service myself. According to your >>>>>> comments, I modified the output now it is: >>>>>> >>>>>> $ curl https://go.xrfang.cn/hap/v2?go-get=1 >>>>>> <meta name="go-import" content="go.xrfang.cn/hap git >>>>>> https://e.coding.net/xrfang/go/hap.git"> >>>>>> >>>>>> But it still not working: >>>>>> >>>>>> $ GOPROXY=direct go get -v -x -u go.xrfang.cn/hap/v...@v2.0.0-alpha.2 >>>>>> <http://go.xrfang.cn/hap/v2@v2.0.0-alpha.2> >>>>>> # get https://go.xrfang.cn/hap/v2?go-get=1 >>>>>> # get https://go.xrfang.cn/hap/v2?go-get=1: 200 OK (0.043s) >>>>>> get "go.xrfang.cn/hap/v2": found meta tag vcs.metaImport{Prefix:" >>>>>> go.xrfang.cn/hap", VCS:"git", RepoRoot:" >>>>>> https://e.coding.net/xrfang/go/hap.git"} at // >>>>>> go.xrfang.cn/hap/v2?go-get=1 >>>>>> get "go.xrfang.cn/hap/v2": verifying non-authoritative meta tag >>>>>> # get https://go.xrfang.cn/hap?go-get=1 >>>>>> # get https://go.xrfang.cn/hap?go-get=1: 200 OK (0.007s) >>>>>> >>>>>> mkdir -p /home/xrfang/go/pkg/mod/cache/vcs # git3 >>>>>> https://e.coding.net/xrfang/go/hap.git >>>>>> # lock >>>>>> /home/xrfang/go/pkg/mod/cache/vcs/0f263e071aed73ec9ef118d38d27fc7cbbcc33f1c19bbac5423684b8b560e3f9.lock >>>>>> # >>>>>> /home/xrfang/go/pkg/mod/cache/vcs/0f263e071aed73ec9ef118d38d27fc7cbbcc33f1c19bbac5423684b8b560e3f9 >>>>>> >>>>>> for git3 https://e.coding.net/xrfang/go/hap.git >>>>>> cd >>>>>> /home/xrfang/go/pkg/mod/cache/vcs/0f263e071aed73ec9ef118d38d27fc7cbbcc33f1c19bbac5423684b8b560e3f9; >>>>>> >>>>>> git tag -l >>>>>> 0.008s # cd >>>>>> /home/xrfang/go/pkg/mod/cache/vcs/0f263e071aed73ec9ef118d38d27fc7cbbcc33f1c19bbac5423684b8b560e3f9; >>>>>> >>>>>> git tag -l >>>>>> >>>>>> cd >>>>>> /home/xrfang/go/pkg/mod/cache/vcs/0f263e071aed73ec9ef118d38d27fc7cbbcc33f1c19bbac5423684b8b560e3f9; >>>>>> >>>>>> git -c log.showsignature=false log --no-decorate -n1 '--format=format:%H >>>>>> %ct %D' refs/tags/v2.0.0-alpha.2 -- >>>>>> 0.007s # cd >>>>>> /home/xrfang/go/pkg/mod/cache/vcs/0f263e071aed73ec9ef118d38d27fc7cbbcc33f1c19bbac5423684b8b560e3f9; >>>>>> >>>>>> git -c log.showsignature=false log --no-decorate -n1 '--format=format:%H >>>>>> %ct %D' refs/tags/v2.0.0-alpha.2 -- >>>>>> >>>>>> cd >>>>>> /home/xrfang/go/pkg/mod/cache/vcs/0f263e071aed73ec9ef118d38d27fc7cbbcc33f1c19bbac5423684b8b560e3f9; >>>>>> >>>>>> git cat-file blob 931943650fcb745bf3219ad4bf1ca93177047a5a:go.mod >>>>>> 0.001s # cd >>>>>> /home/xrfang/go/pkg/mod/cache/vcs/0f263e071aed73ec9ef118d38d27fc7cbbcc33f1c19bbac5423684b8b560e3f9; >>>>>> >>>>>> git cat-file blob 931943650fcb745bf3219ad4bf1ca93177047a5a:go.mod >>>>>> cd >>>>>> /home/xrfang/go/pkg/mod/cache/vcs/0f263e071aed73ec9ef118d38d27fc7cbbcc33f1c19bbac5423684b8b560e3f9; >>>>>> >>>>>> git cat-file blob 931943650fcb745bf3219ad4bf1ca93177047a5a:v2/go.mod >>>>>> 0.001s # cd >>>>>> /home/xrfang/go/pkg/mod/cache/vcs/0f263e071aed73ec9ef118d38d27fc7cbbcc33f1c19bbac5423684b8b560e3f9; >>>>>> >>>>>> git cat-file blob 931943650fcb745bf3219ad4bf1ca93177047a5a:v2/go.mod >>>>>> # get >>>>>> https://sum.golang.org/lookup/go.xrfang.cn/hap/v...@v2.0.0-alpha.2 >>>>>> <https://sum.golang.org/lookup/go.xrfang.cn/hap/v2@v2.0.0-alpha.2> >>>>>> # get >>>>>> https://sum.golang.org/lookup/go.xrfang.cn/hap/v...@v2.0.0-alpha.2 >>>>>> <https://sum.golang.org/lookup/go.xrfang.cn/hap/v2@v2.0.0-alpha.2>: >>>>>> 404 Not Found (1.681s) >>>>>> go: go.xrfang.cn/hap/v...@v2.0.0-alpha.2 >>>>>> <http://go.xrfang.cn/hap/v2@v2.0.0-alpha.2>: verifying go.mod: >>>>>> go.xrfang.cn/hap/v...@v2.0.0-alpha.2/go.mod >>>>>> <http://go.xrfang.cn/hap/v2@v2.0.0-alpha.2/go.mod>: reading >>>>>> https://sum.golang.org/lookup/go.xrfang.cn/hap/v...@v2.0.0-alpha.2 >>>>>> <https://sum.golang.org/lookup/go.xrfang.cn/hap/v2@v2.0.0-alpha.2>: >>>>>> 404 Not Found >>>>>> server response: >>>>>> not found: go.xrfang.cn/hap/v...@v2.0.0-alpha.2 >>>>>> <http://go.xrfang.cn/hap/v2@v2.0.0-alpha.2>: unrecognized import >>>>>> path "go.xrfang.cn/hap/v2": reading >>>>>> https://go.xrfang.cn/hap/v2?go-get=1: 404 Not Found >>>>>> server response: not found >>>>>> >>>>>> >>>>>> >>>>>> >>>>>> >>>>>> Jason Phillips <jasonrya...@gmail.com> 于2024年4月17日周三 20:18写道: >>>>>> >>>>>>> I believe the hosting provider is returning a meta tag for " >>>>>>> go.xrfang.cn/hap/v2" when it shouldn't? >>>>>>> >>>>>>> > curl https://go.xrfang.cn/hap/v2?go-get=1 >>>>>>> <meta name="go-import" content="go.xrfang.cn/hap/v2 git >>>>>>> https://e.coding.net/xrfang/go/hap.git"> >>>>>>> >>>>>>> The above meta tag says that the "go.xrfang.cn/hap/v2" module is at >>>>>>> the root of the repository, but it's not. That meta tag would be >>>>>>> correct if >>>>>>> you completely replaced your v1 module with the v2 module. I think the >>>>>>> meta >>>>>>> tag needs to be the following for it to work for your current v2 module: >>>>>>> >>>>>>> <meta name="go-import" content="go.xrfang.cn/hap git >>>>>>> https://e.coding.net/xrfang/go/hap.git"> >>>>>>> >>>>>>> Or, the hosting provider should return a 404 (with no meta tag) for " >>>>>>> go.xrfang.cn/hap/v2". >>>>>>> >>>>>>> Compare the output from Github for a module with a major version >>>>>>> directory: >>>>>>> >>>>>>> > curl https://github.com/wailsapp/wails/v2?go-get=1 >>>>>>> Not Found >>>>>>> On Wednesday, April 17, 2024 at 5:46:15 AM UTC-4 Xiangrong Fang >>>>>>> wrote: >>>>>>> >>>>>>>> Hello, >>>>>>>> <https://stackoverflow.com/posts/78338632/timeline> >>>>>>>> >>>>>>>> I am developing version 2 of my hap <https://go.xrfang.cn/hap/v2> >>>>>>>> package, which is a HTTP API framework. Version 2 is not ready yet, >>>>>>>> and the >>>>>>>> latest release ls v2.0.0-alpha.2, like so: >>>>>>>> >>>>>>>> * 9319436 - bug fix, refined action error output (HEAD -> master, >>>>>>>> tag: v2.0.0-alpha.2, origin/master, origin/HEAD) >>>>>>>> * 2b1046a - various improvements (20 hours ago) >>>>>>>> * 464dcb7 - example: added source IP control and global logging >>>>>>>> (tag: v2.0.0-alpha.1) >>>>>>>> * 94d6607 - reversed finalizer execution order >>>>>>>> * 7604144 - added global actions and finalizers >>>>>>>> ... ... >>>>>>>> >>>>>>>> The directory structure of the entire repo is: >>>>>>>> >>>>>>>> ├── example/ >>>>>>>> ├── go.mod >>>>>>>> ├── LICENSE >>>>>>>> ├── README.md >>>>>>>> └── v2/ >>>>>>>> ├── go.mod >>>>>>>> └── example/ >>>>>>>> >>>>>>>> The go.mod under the root directory is: >>>>>>>> >>>>>>>> module go.xrfang.cn/hap >>>>>>>> go 1.17 >>>>>>>> >>>>>>>> while v2/go.mod looks like: >>>>>>>> >>>>>>>> module go.xrfang.cn/hap/v2 >>>>>>>> go 1.22.1 >>>>>>>> >>>>>>>> The problem now is go failed to get the v2 pre-release, go mod tidy >>>>>>>> under a project using hap/v2: >>>>>>>> >>>>>>>> go: downloading go.xrfang.cn/hap/v2 v2.0.0-alpha.2 >>>>>>>> go: usermgr imports >>>>>>>> go.xrfang.cn/hap/v2: go.mod has non-.../v2 module path " >>>>>>>> go.xrfang.cn/hap" at revision v2.0.0-alpha.2 >>>>>>>> go: usermgr imports >>>>>>>> go.xrfang.cn/hap/v2/api: go.mod has non-.../v2 module path >>>>>>>> "go.xrfang.cn/hap" at revision v2.0.0-alpha.2 >>>>>>>> go: usermgr imports >>>>>>>> ... ... >>>>>>>> >>>>>>>> Using go get: >>>>>>>> >>>>>>>> $ GOPROXY=direct go get -u -v -x >>>>>>>> go.xrfang.cn/hap/v...@v2.0.0-alpha.2 >>>>>>>> <http://go.xrfang.cn/hap/v2@v2.0.0-alpha.2> >>>>>>>> # get https://go.xrfang.cn/hap/v2?go-get=1 >>>>>>>> # get https://go.xrfang.cn/hap/v2?go-get=1: 200 OK (0.196s) >>>>>>>> get "go.xrfang.cn/hap/v2": found meta tag vcs.metaImport{Prefix:" >>>>>>>> go.xrfang.cn/hap/v2", VCS:"git", RepoRoot:" >>>>>>>> https://e.coding.net/xrfang/go/hap.git"} at // >>>>>>>> go.xrfang.cn/hap/v2?go-get=1 >>>>>>>> mkdir -p /home/xrfang/go/pkg/mod/cache/vcs # git3 >>>>>>>> https://e.coding.net/xrfang/go/hap.git >>>>>>>> # lock >>>>>>>> /home/xrfang/go/pkg/mod/cache/vcs/0f263e071aed73ec9ef118d38d27fc7cbbcc33f1c19bbac5423684b8b560e3f9.lock >>>>>>>> # >>>>>>>> /home/xrfang/go/pkg/mod/cache/vcs/0f263e071aed73ec9ef118d38d27fc7cbbcc33f1c19bbac5423684b8b560e3f9 >>>>>>>> >>>>>>>> for git3 https://e.coding.net/xrfang/go/hap.git >>>>>>>> cd >>>>>>>> /home/xrfang/go/pkg/mod/cache/vcs/0f263e071aed73ec9ef118d38d27fc7cbbcc33f1c19bbac5423684b8b560e3f9; >>>>>>>> >>>>>>>> git tag -l >>>>>>>> 0.002s # cd >>>>>>>> /home/xrfang/go/pkg/mod/cache/vcs/0f263e071aed73ec9ef118d38d27fc7cbbcc33f1c19bbac5423684b8b560e3f9; >>>>>>>> >>>>>>>> git tag -l >>>>>>>> cd >>>>>>>> /home/xrfang/go/pkg/mod/cache/vcs/0f263e071aed73ec9ef118d38d27fc7cbbcc33f1c19bbac5423684b8b560e3f9; >>>>>>>> >>>>>>>> git -c log.showsignature=false log --no-decorate -n1 >>>>>>>> '--format=format:%H >>>>>>>> %ct %D' refs/tags/v2.0.0-alpha.2 -- >>>>>>>> 0.003s # cd >>>>>>>> /home/xrfang/go/pkg/mod/cache/vcs/0f263e071aed73ec9ef118d38d27fc7cbbcc33f1c19bbac5423684b8b560e3f9; >>>>>>>> >>>>>>>> git -c log.showsignature=false log --no-decorate -n1 >>>>>>>> '--format=format:%H >>>>>>>> %ct %D' refs/tags/v2.0.0-alpha.2 -- >>>>>>>> cd >>>>>>>> /home/xrfang/go/pkg/mod/cache/vcs/0f263e071aed73ec9ef118d38d27fc7cbbcc33f1c19bbac5423684b8b560e3f9; >>>>>>>> >>>>>>>> git cat-file blob 931943650fcb745bf3219ad4bf1ca93177047a5a:go.mod >>>>>>>> 0.002s # cd >>>>>>>> /home/xrfang/go/pkg/mod/cache/vcs/0f263e071aed73ec9ef118d38d27fc7cbbcc33f1c19bbac5423684b8b560e3f9; >>>>>>>> >>>>>>>> git cat-file blob 931943650fcb745bf3219ad4bf1ca93177047a5a:go.mod >>>>>>>> go: go.xrfang.cn/hap/v...@v2.0.0-alpha.2 >>>>>>>> <http://go.xrfang.cn/hap/v2@v2.0.0-alpha.2>: go.mod has non-.../v2 >>>>>>>> module path "go.xrfang.cn/hap" at revision v2.0.0-alpha.2 >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> -- >>>>>>> You received this message because you are subscribed to a topic in >>>>>>> the Google Groups "golang-nuts" group. >>>>>>> To unsubscribe from this topic, visit >>>>>>> https://groups.google.com/d/topic/golang-nuts/fabOo575rLQ/unsubscribe >>>>>>> . >>>>>>> To unsubscribe from this group and all its topics, send an email to >>>>>>> golang-nuts...@googlegroups.com. >>>>>>> To view this discussion on the web visit >>>>>>> https://groups.google.com/d/msgid/golang-nuts/8f42f5cf-a69b-43c9-92e2-b72b8e1b90c8n%40googlegroups.com >>>>>>> >>>>>>> <https://groups.google.com/d/msgid/golang-nuts/8f42f5cf-a69b-43c9-92e2-b72b8e1b90c8n%40googlegroups.com?utm_medium=email&utm_source=footer> >>>>>>> . >>>>>>> >>>>>> -- >>>>> You received this message because you are subscribed to a topic in the >>>>> Google Groups "golang-nuts" group. >>>>> To unsubscribe from this topic, visit >>>>> https://groups.google.com/d/topic/golang-nuts/fabOo575rLQ/unsubscribe. >>>>> To unsubscribe from this group and all its topics, send an email to >>>>> golang-nuts...@googlegroups.com. >>>>> >>>> To view this discussion on the web visit >>>>> https://groups.google.com/d/msgid/golang-nuts/726cfae3-bd87-4081-b1a9-bc4ef1bbce6fn%40googlegroups.com >>>>> >>>>> <https://groups.google.com/d/msgid/golang-nuts/726cfae3-bd87-4081-b1a9-bc4ef1bbce6fn%40googlegroups.com?utm_medium=email&utm_source=footer> >>>>> . >>>>> >>>> -- >>> You received this message because you are subscribed to a topic in the >>> Google Groups "golang-nuts" group. >>> To unsubscribe from this topic, visit >>> https://groups.google.com/d/topic/golang-nuts/fabOo575rLQ/unsubscribe. >>> To unsubscribe from this group and all its topics, send an email to >>> golang-nuts...@googlegroups.com. >>> >> To view this discussion on the web visit >>> https://groups.google.com/d/msgid/golang-nuts/4ff4a619-7dcc-4d31-a503-9616121c19a5n%40googlegroups.com >>> >>> <https://groups.google.com/d/msgid/golang-nuts/4ff4a619-7dcc-4d31-a503-9616121c19a5n%40googlegroups.com?utm_medium=email&utm_source=footer> >>> . >>> >> -- 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. To view this discussion on the web visit https://groups.google.com/d/msgid/golang-nuts/e230fa3c-53f2-4ab3-91bc-212c8f1e8d55n%40googlegroups.com.