For a given package `foo`, the general idea regarding new changes that as 
I've understood it is:

   1. Changes to existing functionality that break things belong in a new 
   package `foo2` that provides differently named modules/collections from 
   `foo`, since it's essentially completely different behavior. This allows 
   both `foo` and `foo2` to be installed at once, such that code using the old 
   package can coexist with code using the new one. This also means unless you 
   explicitly choose to use the changed functionality by requiring `foo2`, 
   your code won't break, and you can selectively upgrade parts of a codebase 
   to use `foo2` instead of having to upgrade the whole shebang at once.
   2. New features should up the version number in the package's 
   `info.rkt`. This means different package sources for the same package name 
   can declare which features are available, and client code can define a 
   minimum set of features it requires.
   3. Bug fixes and other changes to existing functionality that don't 
   break things for well-behaved clients (for some reasonable definition of 
   "doesn't break things" and "well-behaved clients") don't really need to 
   update the package's `info.rkt`, but it would be a good idea if they did. 
   They should increase the version number less than new features do (e.g. 1.0 
   -> 1.1 instead of 1.0 -> 2.0). This gives more flexibility to client code 
   feature specification, a client package can say "I really want 1.0, but it 
   has a bug in it that wouldn't be fixed until 2.0, but 2.0 has features I 
   don't need".
   4. For packages whose name includes the author name, e.g. "jack-mock", 
   or for modules or collections in the "unstable" collection, all bets are 
   off. Existing functionality may change without warning, new stuff could be 
   added, old stuff could be removed, multiple times a day. This gives package 
   authors ways to experiment with published code while warning clients of 
   experimental behavior.

At least, this is how I've been attempting to do things recently. It seems 
like a pretty reasonable way of working. The biggest problem thus far with 
this workflow is that if a package `foo` says "I require version 2.0 of 
package X", the package catalog can only give you the most recent version 
of package X. This isn't a major issue if package X is well-behaved 
regarding backwards compatibility, but as these are social rules and not 
technical ones, outliers will exist. The "safest" thing for installation to 
do would be to install version 2.0, as it's the closest match to the 
features required by `foo`.

In order to support this, would it make sense for the package X to have 
something like this in it's info.rkt?

(define version-sources
  (hash "1.0" package-source-for-foo-1.0
        "1.1" package-source-for-foo-1.1
        "2.0" package-source-for-foo-2.0))

I think it would be possible for the package catalog and package build 
server to use this information to figure out what to do with requests for a 
particular version of a package name. I don't know enough about the 
implementation of that infrastructure to know how feasible this is however.

What are some alternate ways of versioning packages? Should this process be 
documented and referenced by the package catalog website? Or the main 
racket documentation on packages?

-- 
You received this message because you are subscribed to the Google Groups 
"Racket Developers" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to racket-dev+unsubscr...@googlegroups.com.
To post to this group, send email to racket-dev@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/racket-dev/715bb22a-12e7-4d51-bdd3-f91f5a80c6ad%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to