> The review of "SE-0145: Package Manager Version Pinning" begins again after 
> revisions, starting now and running through November 28th. The proposal is 
> available here:
> 
>       
> https://github.com/apple/swift-evolution/blob/master/proposals/0145-package-manager-version-pinning.md
>  
> <https://github.com/apple/swift-evolution/blob/master/proposals/0145-package-manager-version-pinning.md>
> 


> What is your evaluation of the proposal?

+1
I think this is an important change for the Swift package ecosystem.
Having reproducible builds by default is a big step forward.
Storing the version of all dependencies in version control and having an easy 
way to update them helps to reduce maintenance overhead of packages.

I have two comments / requests for improvement:
 * Having two completely separate modes (—enable-autopin vs. —disable-autopin) 
with a different semantic (e.g. for `swift update`) unnecessarily complicates 
the design. I understand that there are different use cases where packages have 
to be handled differently, however I think we should invest some more time on 
understanding these use cases (see below).
 * For me the term ‚pin‘ (just like ‚lock‘) implies that the version of pinned 
dependencies should be fixed and should therefore not be changed/updated. (But 
I’m not a native speaker, so you may have other associations here.) We should 
make clear that we *manage* dependencies and that dependencies should be easy 
to update even while they can be reproduced exactly.

Let’s look at the features of the proposal and how they can be used:
 * Defines two groups of dependencies (pinned vs. unpinned) where one group can 
be updated independently;
 * unpinned dependencies are automatically updated on clone, not just on update;
 * updates of unpinned dependencies are not considered a change in the 
package’s repository.
This can be used to easily update internal dependencies while keeping the same 
version of external dependencies.
Or to keep some difficult-to-update dependencies while constantly updating all 
the other dependencies.
Or to not create git changes for some selected dependencies.
You name it.

Basically it boils down to better control when and how dependencies are updated.
However, I’m not yet convinced that the proposed pinning system is the best way 
to do that.
Why only support two groups? Why these two modes of operation? Why not support 
a specific set of dependencies which are unmanaged while still tracking all new 
dependencies?

When we want to create groups of dependencies and handle them differently, then 
we should do that explicitly, by introducing groups which can be defined by the 
package maintainer.

E.g.:

        swift package dependency <dep-name> —group <group-name>

We could store each group in a file of its own (e.g. 
`Package-<group-name>.versions` or whatever) and the maintainer could put each 
one under version control or not as he likes.

A whole group could be updated in one go:

        swift package update —group internal

This could simulate the pinning as described in the proposal:

        swift package dependency A —group unpinned
        swift package dependency B —group pinned
        echo Package-unpinned.versions > .gitignore
        git add .gitignore Package-pinned.versions

Each group can be updated individually and the package maintainer can put this 
group under version control or not.
One group would have to be special to automatically include all new 
dependencies.
Other than that we would not need any special handling ala 
—repin/—enable-autopin. Groups could be defined to make updating related 
packages easier.
When needed, we could even set some groups to update automatically on build 
(not only on clone/update).
This could be useful for closely related packages. Why should clone be special 
anyways?


>  Is the problem being addressed significant enough to warrant a change to 
> Swift?

Yes.
Not managing the package dependencies would unnecessarily complicate package 
maintenance in the long term.


> Does this proposal fit well with the feel and direction of Swift?

Yes.
Reproducible builds fit well into the safe-by-default approach of Swift.


> If you have used other languages or libraries with a similar feature, how do 
> you feel that this proposal compares to those?

I always hated `npm` and all those node packages which had overly restrictive 
dependency requirements.
I guess these were used in order to have more control about which version to 
use, but this resulted
in both packages which I could not build out of the box (because some 
dependencies changed),
and packages I could not update because of conflicting requirements.
Using loose version requirements + semver in `Package.swift` files together 
with exact versions
of all dependencies stored in the top-level package solves everything: you get 
reproducible builds
(based on `Package*.versions`) together with easy updates (based on all 
packages’ `Package.swift`).


> How much effort did you put into your review? A glance, a quick reading, or 
> an in-depth study?


Read both versions of the proposal, took part in the discussion.

— Martin Waitz
_______________________________________________
swift-evolution mailing list
[email protected]
https://lists.swift.org/mailman/listinfo/swift-evolution

Reply via email to