Hi Scott, Modules do provide support for semver pre-release notation. You can read more about it in these sections of the documentation, for example:
https://tip.golang.org/cmd/go/#hdr-Module_queries https://tip.golang.org/cmd/go/#hdr-Pseudo_versions https://tip.golang.org/cmd/go/#hdr-Module_aware_go_get --thepudds On Sunday, September 16, 2018 at 10:31:43 AM UTC-4, Scott Cotton wrote: > > Thanks Sameer, > > I have a question about semver and modules, perhaps it was already > answered somewhere, but if so I don't know where. > > The question is: semver.org allows for pre-release notation, the document > below does not mention pre-release. > To some extent Go uses pre-releases. > > I, for one, find the idea useful and would like to use pre-release info > with modules. > > So can anyone comment, inform, or provide a pointer to some documentation > about pre-releases as they relate to modules? > > Best, > Scott > > On 15 September 2018 at 22:11, Sameer Ajmani <sam...@golang.org > <javascript:>> wrote: > >> Thanks. The relationship between semantic versioning and Go packages is >> described in detail here: https://research.swtch.com/vgo-import >> On Sat, Sep 15, 2018 at 3:52 PM <thepud...@gmail.com <javascript:>> >> wrote: >> >>> Hi all, >>> >>> One additional set of brief comments. >>> >>> This was a fairly nuanced and long thread, and I'm pretty sure I did not >>> follow all of it, but I think a question related to the conversation here >>> is -- what does 'require foo v1.1.1' really mean? >>> >>> Perhaps one way to think about that usage of the verb 'require' is that >>> it really needs to be read in the context of semantic versioning ( >>> https://semver.org). >>> >>> If something states it requires v1.1.1 of foo, in the context of >>> semantic versioning that really means that particular requirement for >>> v1.1.1 would be satisfied by foo >= v1.1.1 and < v2, given semver defines >>> versions in that interval to be valid and backwards compatible >>> substitutions for v1.1.1 (and anything v2 or higher is considered >>> incompatible with any v1 version). >>> >>> And a variation of that first question is -- what does it mean for a >>> build if you have both a 'require foo v1.1.1' and a 'require foo v1.2.2'? >>> >>> One initial guess might be that the build ends up with two copies of foo >>> (v1.1.1 and v1.2.2) given there are two 'require' statements with those two >>> different versions. That is a reasonable guess, but not actually what >>> happens. >>> >>> If you instead read that verb 'require' in the context of semantic >>> versioning, it means that if the build instead picks a _single_ copy of foo >>> at version v1.2.2, that actually would satisfy _both_ of the requirements >>> for v1.1.1 and v1.2.2 (given v1.2.2 is defined by semver to be a backwards >>> compatible substitution for v1.1.1). And of course, this is what the go >>> build system actually would do in this scenario. >>> >>> Said another way, when you use modules, the go command _mandates_ that >>> modules use semantic versioning and expects that the versions accurately >>> describe compatibility: it assumes that v1.2.2 is a backwards compatible >>> replacement for v1.1.1, and hence v1.2.2 is a valid answer if you have both >>> 'require foo v1.1.1' and a 'require foo v1.2.2'. >>> >>> In any event, this is all still fairly new, and everyone is still >>> learning about the overall system. (The broader community is of course >>> learning about the new system, but even the people who implemented this >>> system are in a learning phase, including because they are learning about >>> how the community will use the new system). >>> >>> --thepudds >>> >>> On Saturday, September 15, 2018 at 1:11:49 PM UTC-4, Scott Cotton wrote: >>>> >>>> Thanks! Very useful. >>>> >>>> +1 for aliasing "go mod list" to "go list -m" >>>> >>>> >>>> >>>> >>>> >>>> On 15 September 2018 at 18:59, <thepud...@gmail.com> wrote: >>>> >>> > "Maybe having a way for "go mod" to output what is used would be >>>>> less confusing?" >>>>> >>>>> Hi all, >>>>> >>>>> To see a list of the selected module versions, one way is to use use >>>>> 'go list -m all'. This shows the actual versions used based on all of >>>>> the >>>>> various requirements in a build. Sample output: >>>>> >>>>> $ go list -m all >>>>> example.com/my/module >>>>> github.com/aws/aws-sdk-go v1.15.35 >>>>> github.com/go-ini/ini v1.25.4 >>>>> >>>>> Another other useful tool is for inspecting requirements is 'go mod >>>>> graph' (which prints the module requirement graph), and if you are >>>>> curious >>>>> why a particular module is showing up in your go.mod, you can run 'go mod >>>>> why -m <module>' to answer that question. >>>>> >>>>> You can read some more about these here: >>>>> >>>>> >>>>> https://tip.golang.org/cmd/go/#hdr-The_main_module_and_the_build_list >>>>> >>>>> https://tip.golang.org/cmd/go/#hdr-Explain_why_packages_or_modules_are_needed >>>>> https://tip.golang.org/cmd/go/#hdr-Print_module_requirement_graph >>>>> >>>>> The first link above also provides a short description of the build >>>>> list, which is related to several of the questions raised in this thread: >>>>> >>>>> ---------------- >>>>> "The set of modules providing packages to builds is called the >>>>> "build list". The build list initially contains only the main module. >>>>> Then >>>>> the go command adds to the list the exact module versions required by >>>>> modules already on the list, recursively, until there is nothing left to >>>>> add to the list. If multiple versions of a particular module are added to >>>>> the list, then at the end only the latest version (according to semantic >>>>> version ordering) is kept for use in the build." >>>>> ---------------- >>>>> >>>>> --thepudds >>>>> >>>>> On Saturday, September 15, 2018 at 6:34:55 AM UTC-4, Scott Cotton >>>>> wrote: >>>>>> >>>>>> Thanks for the clarification. >>>>>> >>>>>> Maybe having a way for "go mod" to output what is used would be less >>>>>> confusing? I would have found so at least. >>>>>> >>>>>> Cycles crossing major versions may be more problematic. >>>>>> >>>>>> similarly in the case of coordinating a collection of modules, >>>>>> dependency cycles may lead unintentionally to different used versions >>>>>> depending on the build context. While the potential use of multiple >>>>>> versions is a useful feature of modules, I am not convinced >>>>>> that in this context it is desirable. Also, if cycles can span >>>>>> arbitrarily large sets of uncoordinated modules, then it seems to me that >>>>>> is not the intended use case for cycles and that might be undesirable >>>>>> or even lead to the inability of a module maintainer in the cycle >>>>>> to effectively propagate an update. >>>>>> >>>>>> If I come across anything more concrete, I'll file an issue. Just >>>>>> food for thought at this point. >>>>>> >>>>>> Best >>>>>> Scott >>>>>> >>>>>> On Saturday, 15 September 2018 02:45:50 UTC+2, Sameer Ajmani wrote: >>>>>>> >>>>>>> Go modules can use the listed version or later minor versions. So if >>>>>>> B depends on v1.11 of A, then it can also work with v1.12 of A. >>>>>>> Therefore a >>>>>>> valid set of versions for the build is A v1.12 and B v1.3. >>>>>>> >>>>>>> On Mon, Sep 10, 2018 at 1:28 AM Scott Cotton <w...@iri-labs.com> >>>>>>> wrote: >>>>>>> >>>>>>>> Well, ok. >>>>>>>> >>>>>>>> Did you mean if A v1.12 of a module depends on v1.3 of B which >>>>>>>> depends on v1.11 of A? >>>>>>>> >>>>>>>> So go modules don't actually necessarily depend on the listed >>>>>>>> dependencies? >>>>>>>> >>>>>>>> That is quite counteruintintive to me. >>>>>>>> >>>>>>>> It is much simpler in any case to use acyclic dependencies. >>>>>>>> >>>>>>>> Scott >>>>>>>> >>>>>>>> On 10 September 2018 at 04:25, Sameer Ajmani <sam...@golang.org> >>>>>>>> wrote: >>>>>>>> >>>>>>>>> I think there's a disconnection between how you and I understand >>>>>>>>> this system works. In a given build, there is only a single version >>>>>>>>> of a >>>>>>>>> module; there cannot be multiple copies, let alone many copies.So if >>>>>>>>> v1.11 >>>>>>>>> of module A depends on v1.3 of module B, which in turn depends on >>>>>>>>> v1.12 of >>>>>>>>> module A, then the build will choose A v1.12. The is only one version >>>>>>>>> of A >>>>>>>>> in the build. >>>>>>>>> >>>>>>>>> On Sun, Sep 9, 2018 at 1:40 PM Scott Cotton <w...@iri-labs.com> >>>>>>>>> wrote: >>>>>>>>> >>>>>>>>>> Hi Sameer, >>>>>>>>>> >>>>>>>>>> Thanks for asking, here are some thoughts, >>>>>>>>>> >>>>>>>>>> With time, this could create man many many copies of (different >>>>>>>>>> versions) of a module. >>>>>>>>>> this would slow down fetch, storage, compilation, etc potentially >>>>>>>>>> a lot, and it would only >>>>>>>>>> get worse and worse over time. >>>>>>>>>> >>>>>>>>>> if a security patch is applied to the most recent version in a >>>>>>>>>> version-compatible space of >>>>>>>>>> a module that depends on an earlier version of itself, then the >>>>>>>>>> security hole may still exist. >>>>>>>>>> Moreover, if the SCC of module dependencies is outside the >>>>>>>>>> control of the authors of the >>>>>>>>>> module being patched, it seems there is might be no way they >>>>>>>>>> could propagate the patch >>>>>>>>>> without editing history, which violates the very notion of >>>>>>>>>> versioning to begin with. >>>>>>>>>> >>>>>>>>>> The notion of software moving forward by versioning is in part an >>>>>>>>>> increase in reliability, >>>>>>>>>> not just security patches, so I would be frightened to use cyclic >>>>>>>>>> modules even in code >>>>>>>>>> for which I were certain there would be no security patches (like >>>>>>>>>> fixed memory, known cpu bounds >>>>>>>>>> math algorithms for example) >>>>>>>>>> >>>>>>>>>> Other than that, it is to me very confusing and counter-intuitive >>>>>>>>>> that a version of some software >>>>>>>>>> depend on a previous version of itself. Maybe I'm missing >>>>>>>>>> something in the modules >>>>>>>>>> specification or vision, and maybe, (even hopefully) I am wrong >>>>>>>>>> about these concerns. >>>>>>>>>> >>>>>>>>>> I could list more related ideas, but given that I might be wrong >>>>>>>>>> I'll leave it at that. >>>>>>>>>> >>>>>>>>>> Thanks, >>>>>>>>>> >>>>>>>>>> Scott >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> On 9 September 2018 at 19:19, Sameer Ajmani <sam...@golang.org> >>>>>>>>>> wrote: >>>>>>>>>> >>>>>>>>>>> If a module depends on an earlier version itself, and successive >>>>>>>>>>> versions are backwards compatible, why is it not OK for the current >>>>>>>>>>> version >>>>>>>>>>> to satisfy that dependency? >>>>>>>>>>> >>>>>>>>>>> On Sun, Sep 9, 2018 at 1:13 PM Scott Cotton <w...@iri-labs.com> >>>>>>>>>>> wrote: >>>>>>>>>>> >>>>>>>>>>>> Hi Sameer, >>>>>>>>>>>> >>>>>>>>>>>> When I had a module self-dependency, I considered the fact that >>>>>>>>>>>> it worked a bug. I had not followed >>>>>>>>>>>> closely enough til this discussion to think of it as expected. >>>>>>>>>>>> >>>>>>>>>>>> As someone who has a tendency to often ask themself: "worse >>>>>>>>>>>> case how can this be a problem?" >>>>>>>>>>>> >>>>>>>>>>>> the list is indeed long and severe for modules which depend on >>>>>>>>>>>> themselves backwards in time. >>>>>>>>>>>> >>>>>>>>>>>> For cyclic dependencies which are somehow synchronised so that >>>>>>>>>>>> there is no backwards in time >>>>>>>>>>>> propagation, my impression would be "that's complicated", but I >>>>>>>>>>>> can't see offhand how it would be >>>>>>>>>>>> as problematic as backward in time self dependencies. >>>>>>>>>>>> >>>>>>>>>>>> Scott >>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> On 9 September 2018 at 18:38, Sameer Ajmani <sam...@golang.org> >>>>>>>>>>>> wrote: >>>>>>>>>>>> >>>>>>>>>>>>> With respect to errors, I'm asking how things failed when you >>>>>>>>>>>>> had a cyclic module dependency. My expectation is that this >>>>>>>>>>>>> should just >>>>>>>>>>>>> work. If your module 0.12 has a dependency on itself with min >>>>>>>>>>>>> version 0.11, >>>>>>>>>>>>> then 0.12 satisfies that dependency (as long as it's following >>>>>>>>>>>>> the import >>>>>>>>>>>>> compatibility rule, which isn't necessarily expected for pre-1.0 >>>>>>>>>>>>> modules). >>>>>>>>>>>>> >>>>>>>>>>>>> On Sun, Sep 9, 2018 at 9:10 AM Scott Cotton <w...@iri-labs.com> >>>>>>>>>>>>> wrote: >>>>>>>>>>>>> >>>>>>>>>>>>>> Hi Sameer, >>>>>>>>>>>>>> >>>>>>>>>>>>>> I don't know what is considered an error and not an error >>>>>>>>>>>>>> with cyclic module dependencies. >>>>>>>>>>>>>> >>>>>>>>>>>>>> Honestly, it makes my head hurt and simply requires too much >>>>>>>>>>>>>> thought that I'd rather spend on the code. >>>>>>>>>>>>>> >>>>>>>>>>>>>> For example, I don't want to think what will happen to some >>>>>>>>>>>>>> SCC in a module dependency graph after >>>>>>>>>>>>>> a decade of development, in particular if a module can depend >>>>>>>>>>>>>> on an earlier version of itself. >>>>>>>>>>>>>> >>>>>>>>>>>>>> Scott >>>>>>>>>>>>>> >>>>>>>>>>>>>> >>>>>>>>>>>>>> >>>>>>>>>>>>>> >>>>>>>>>>>>>> >>>>>>>>>>>>>> >>>>>>>>>>>>>> On 9 September 2018 at 14:19, Sameer Ajmani < >>>>>>>>>>>>>> sam...@golang.org> wrote: >>>>>>>>>>>>>> >>>>>>>>>>>>>>> Are you seeing errors when there are cyclic module >>>>>>>>>>>>>>> dependencies? As I recall, cyclic dependencies between modules >>>>>>>>>>>>>>> (not >>>>>>>>>>>>>>> packages) must be allowed: >>>>>>>>>>>>>>> https://research.swtch.com/vgo-mvs >>>>>>>>>>>>>>> "Note that F 1.1 requires G 1.1, but G 1.1 also requires F >>>>>>>>>>>>>>> 1.1. Declaring this kind of cycle can be important when >>>>>>>>>>>>>>> singleton >>>>>>>>>>>>>>> functionality moves from one module to another. Our algorithms >>>>>>>>>>>>>>> must not >>>>>>>>>>>>>>> assume the module requirement graph is acyclic." >>>>>>>>>>>>>>> On Sun, Sep 9, 2018 at 7:58 AM Scott Cotton < >>>>>>>>>>>>>>> w...@iri-labs.com> wrote: >>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> Hi Paul, >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> On 9 September 2018 at 13:44, Paul Jolly <pa...@myitcv.io> >>>>>>>>>>>>>>>> wrote: >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> Hi Scott, >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> > Should cyclic module dependencies be allowed? >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> Yes, indeed in some situations they are totally necessary. >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> I wrote up an experience report on this very topic: >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> https://gist.github.com/myitcv/79c3f12372e13b0cbbdf0411c8c46fd5 >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> Interesting. I'm not sure what cyclic module dependencies >>>>>>>>>>>>>>>> means. I do know some package managers (not go) boast of >>>>>>>>>>>>>>>> having a "solid >>>>>>>>>>>>>>>> transitive dependency model". I hope that any cycles in >>>>>>>>>>>>>>>> modules >>>>>>>>>>>>>>>> dependencies are either avoided or treated in a very clear >>>>>>>>>>>>>>>> simple way by >>>>>>>>>>>>>>>> go's modules. >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> > Should a module, following a cycle, be able to depend on >>>>>>>>>>>>>>>>> an earlier version of itself? (I saw this once...) >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> I can't see how this would work; indeed I can't even >>>>>>>>>>>>>>>>> unravel it in my >>>>>>>>>>>>>>>>> head! Do you have a concrete example to help explain? >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> Unfortunately, my concrete example is lost in sands of >>>>>>>>>>>>>>>> time, so I can only give a rough idea. I had cyclic module >>>>>>>>>>>>>>>> dependencies, >>>>>>>>>>>>>>>> somewhat unintended, but it crept in via some test case. I >>>>>>>>>>>>>>>> was playing >>>>>>>>>>>>>>>> with 111 or late 111 release candidate with it and asked it to >>>>>>>>>>>>>>>> rebuild >>>>>>>>>>>>>>>> go.mod at an untagged HEAD (I think) that was a few commits >>>>>>>>>>>>>>>> ahead of say >>>>>>>>>>>>>>>> v0.1.2. Then go.mod had that my module required v0.1.1 of >>>>>>>>>>>>>>>> itself in go.mod >>>>>>>>>>>>>>>> "indirectly". All I could figure out was that the module >>>>>>>>>>>>>>>> dependency cycle >>>>>>>>>>>>>>>> A -> B -> A had B depending on an older version of A via a >>>>>>>>>>>>>>>> test case. >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> Scott >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> Thanks, >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> Paul >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> -- >>>>>>>>>>>>>>>> Scott Cotton >>>>>>>>>>>>>>>> President, IRI France SAS >>>>>>>>>>>>>>>> http://www.iri-labs.com >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> -- >>>>>>>>>>>>>>>> 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...@googlegroups.com. >>>>>>>>>>>>>>>> For more options, visit https://groups.google.com/d/optout. >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>> >>>>>>>>>>>>>> >>>>>>>>>>>>>> >>>>>>>>>>>>>> -- >>>>>>>>>>>>>> Scott Cotton >>>>>>>>>>>>>> President, IRI France SAS >>>>>>>>>>>>>> http://www.iri-labs.com >>>>>>>>>>>>>> >>>>>>>>>>>>>> >>>>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> -- >>>>>>>>>>>> Scott Cotton >>>>>>>>>>>> President, IRI France SAS >>>>>>>>>>>> http://www.iri-labs.com >>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> -- >>>>>>>>>> Scott Cotton >>>>>>>>>> President, IRI France SAS >>>>>>>>>> http://www.iri-labs.com >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> -- >>>>>>>> Scott Cotton >>>>>>>> http://www.iri-labs.com >>>>>>>> >>>>>>>> >>>>>>>> -- >>>>> 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/h2r8ktgOOZI/unsubscribe. >>>>> >>>> To unsubscribe from this group and all its topics, send an email to >>>>> golang-nuts...@googlegroups.com. >>>>> >>>> >>>>> For more options, visit https://groups.google.com/d/optout. >>>>> >>>> >>>> >>>> >>>> -- >>>> Scott Cotton >>>> http://www.iri-labs.com >>>> >>>> >>>> -- >>> 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...@googlegroups.com <javascript:>. >>> For more options, visit https://groups.google.com/d/optout. >>> >> -- >> 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/h2r8ktgOOZI/unsubscribe. >> To unsubscribe from this group and all its topics, send an email to >> golang-nuts...@googlegroups.com <javascript:>. >> For more options, visit https://groups.google.com/d/optout. >> > > > > -- > Scott Cotton > http://www.iri-labs.com > > > -- 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.