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 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