On Friday, May 1, 2020 at 9:12:55 PM UTC+8, Jesse Alama wrote:
>
> On Thursday, April 30, 2020 at 2:57:45 PM UTC+2, Jay McCarthy wrote:
>>
>>
>> This is simply a social standard though. There is nothing that 
>> technically prevents you from breaking compatibility, except that your 
>> users may be upset. You can post things on the package server that 
>> follows any rules you want, including conflicting with any other 
>> packages.
>>
>
> I'd like to second this point. There's nothing stopping you from pushing 
> whatever you want to your repo, and hence distributing whatever you want 
> via the package server. I've pushed breaking changes to my packages before, 
> and no one has complained, so I guess I didn't break any part of the 
> interface that they were using. (Or I have no users of my stuff at all, 
> which is certainly possible!)
>
> I don't know how many packages mention, in their description, that they're 
> experimental, explicitly warning me that the interface is unstable and 
> likely to change. I use 'em anyway because they offer useful functionality. 
> I don't recall being nailed by breaking changes, but perhaps I'm just 
> getting lucky.
>
> What exactly is the claim, anyway, about the package server not allowing 
> breaking changes? Is it that if you do a breaking change to your package, 
> then it's possible that other people's packages correspondingly break? If 
> so, then I think that's not a very interesting claim. Does the claim at 
> issue just amount to a restatement of the ethos that Jay mentioned about 
> trying to ensure backwards compatibility for a long time?
>

I think that there are two issues here: 

First there's backwards compatibility -- it is a good idea to keep your 
packages backwards compatible, although sometimes it can be difficult, 
especially with packages which were released too early, before their 
interface stabilized.

Than there are breaking changes.  This does include the backwards 
incompatible changes, but also includes defects.  Defects are 
unintentional, usually unknown to the author at the time of publishing the 
new package version, yet they can break the application.  

As an application author, when my application stops working after updating 
packages, it is little consolation that the API of a package remained 
backwards compatible.

Perhaps I was just unlucky, but I encountered show-stopper defects in the 
first two external packages I tried to use in my application. I had a local 
fix, but had to wait for the author several months to fix the problem (this 
is understandable, the author was busy and these packages were not his top 
priority).   The mechanism I came up with was driven by the following needs:

    (1) sit out a package version because it has a defect
    (2) while sitting out a package version, I want to be able to update 
other packages that are not affected by the defect
    (3) use an alternate source for a package which contains a fix, until 
an official fix is released
    (4) delay updating packages, until I have time to verify that the 
update does not break the application and/or address problems
    (5) be able to reconstruct old software configurations including 
dependencies

Number (5) is very important to me: I have some development branches which 
are active for several months, and when I go bad to an older branch, to 
continue work, the last thing I want is to deal with a package upgrade -- 
this perhaps reflects personal circumstances: I quite often have 1 hour to 
try to progress a feature on an old branch, and if I spend 15 - 20 minutes 
merging master, updating packages and resolving conflicts, that's 25 - 30% 
of available time gone.
 

> (All this said, I'd like to learn more about setting up custom package 
> catalogs, as Alex mentioned, to take matters even more into your own hands.)
>

There is not much to it:  git submodules are widely documented, so I'll 
leave those out, but here is the script that sets up the package catalog 
https://github.com/alex-hhh/ActivityLog2/blob/master/etc/scripts/setup-catalog.sh

And here is the snipped from the build file which sets things up and 
installs packages (note that this install uses "isolation mode" to catch 
dependencies which are not tracked as submodules, don't use the -i switch 
on your development machine):
 

       
 bash ./etc/scripts/setup-catalog.sh -i pkgs/
 raco pkg install --auto tzinfo tzgeolookup data-frame plot-container


I also have added code to my application to verify that the packages are 
installed before building or compiling it and it produdces more user 
friendly error messages. (e.g. it tells the user that they forgot to 
install the "tzinfo" package, rather than failing with a "module not found" 
error).  You can find that here: 
https://github.com/alex-hhh/ActivityLog2/blob/777847f2cdb18ff09596848efc40a332e65da017/rkt/utilities.rkt#L446
 
Alex.
 

-- 
You received this message because you are subscribed to the Google Groups 
"Racket Users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to racket-users+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/racket-users/a2a706d2-d4fd-4f5a-8e63-7df8af1c6279%40googlegroups.com.

Reply via email to