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> 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 <thepudds1...@gmail.com> 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+unsubscr...@googlegroups.com.
>> 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+unsubscr...@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+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to