[Catalog-sig] PEP 345 Update
P.J. Eby
pje at telecommunity.com
Fri Aug 27 22:47:56 CEST 2010
At 02:47 PM 8/26/2010 +0200, Alexis Métaireau wrote:
>Right, the installation *will not* cause problems, but they will
>apear after that. If so, we have two choices:
>- First is to tell nothing to the user about that, and I think
>that's a good option, as it could result in a end user bad
>experience (if that's not handled at the installation level, what
>will handle this?)
>- Second is to prompt the user about what he want to do: Do we have
>to install the release/distribution, even if it can cause problems
>while running them? Are you sure you want to install both, even if
>it could lead to such issues ?, etc.
Informing the user about the conflict isn't a bad idea... but then
again, it sounds like something that would normally be covered in a
project's README.
Notice here the difference between the Python environment and a Linux
distribution: the distribution is not merely *installing* software,
it is also *deploying* it in some sense -- such software is
preconfigured as well as installed, and integrated with the system as a whole.
However, that same software as released by its author is not so
integrated and preconfigured, and thus, these conflict issues cannot
necessarily even be *known* in advance by the author.
IMO, then, the very ideas of Obsoletes and Conflicts are broken in
the software *distribution* context, vs. the software "integration"
or "deployment" context. System packagers can make these kind of
evaluations in the context of their supported integration.
However, with the exception of informing people about an obsoleted
package of theirs, these are not judgments that can be made so
unequivocally by the individual author of a piece of software, as
they have no overview of the integrated whole (as a system
integrator/distributor does).
>>In other words, none of the above is actually a use-case for having
>>a "Conflicts" field.
>I have pain to imagine use cases where conflicts could raise at the
>*installation* level too, but the question seems to be: "do we need
>something to describe installation-related conflicts, or run-related
>conflicts ? In debian apt system, conflicts are described for
>"on-run" issues, IIRC.
...and they're described relative to a specific runtime environment,
which won't really be the case for the individual Python package author.
>>Here's the thing: so far I'm the ONLY person in the discussion who
>>has even offered an example of when Obsoletes would be used... and
>>for the two examples I gave, I would totally be willing to make a
>>new release for them to include that field, if there was some
>>benefit (e.g. user notification) to having the field.
>And that's the use case described in the PEP. So, now, we have to
>choose if it's acceptable to make a new release for updating this
>field, or not.
I was just pointing out that so far, 100% of the people who have
given use cases for Obsoletes are fine with having to issue a new
release to make it Obsoleted-By. ;-)
(However, PyPI already allows metadata field editing of an
already-released package, so as long as the new field were added to
the existing editable fields, that'd be fine too.)
>>(Note that forked packages using the same API only conflict because
>>of *installing conflicting files* -- so if you're thinking of a
>>fork as your example here, it is leading you to confuse the ideas
>>of Obsoletes and Conflicts.)
>I was not thinking about a fork, but about a new rename. That said,
>I must admit that the difference between the two fields is sometimes
>hard to see.
At this point, the only reasonable use of either is to inform the
user about something, and in the case of Obsoletes, it's not
necessarily even the user who's doing the installing! If somebody
installs Foo that depends on RuleDispatch, they are not necessarily
in a position to port Foo to using PEAK-Rules. So, only in the case
where you are declaring a direct dependency from your package to the
obsoleted package, or where you are directly installing the obsoleted
package, do you even need to know anything about it.
In the case of conflicts, conflicts presuppose a specific runtime
environment if the conflict is runtime environment related, and
again, at best all that can be done is to inform the user.
If the conflict is runtime-process related (e.g. two libraries
registering the same Python hook), then only a project that declares
dependencies to both is affected, and only that project's authors
need to be informed.
Given these conditions, it isn't clear that any of these three cases
(obsoletes, environment conflict, in-process conflict) constitute
something that an installation tool should be informing an end-user
about, vs. the developer or integrator who's declaring the
dependencies in the first place.
For example, it might make sense for developer-side tools like
setuptools and buildout to check that one's declared dependencies
don't have conflicts before pushing out an sdist or bdist or doing an
install, and to warn for any obsoleted dependencies. In contrast, an
end-user tool like pip or easy_install would have little reason to
check any of this, as their user isn't really affected by anything
but environment-level conflicts that are unlikely to arise as an
immediate result of installing the software.
>+1. This series of mails point out that we definitely need to talk a
>bit more about the usability of the fields.
>Maybe are we missing something here, and maybe arent we talking
>about the same type of conflicts. In any case, we need to clarify
>all this *before* doing the implementation stuff.
I think that the main thing being missed is that these fields are
being copied from a completely different kind of use case: the
concept of a "package" as a bundle of preconfigured software that is
also pre-integrated with a uniform operating environment. In that
context, it is the curators of that overall environment who are in a
position to make judgments regarding what is a "conflict", or what
packages will "obsolete" each other in the context of that environment.
Lacking such an overall curator organization in the PyPI environment
(and not desiring one, anyway, since PyPI is inherently a software
distribution *catalog* rather than a platform of its own), these
fields make very little sense. They are perhaps most useful as a
centralized way to pass along notifications to developers (or to
curator/integrators of system packages), but have little or no impact
on the software installation process itself.
I also suspect that if you ask those curator/integrators of system
packages, that they will say that the information in these fields
would be of little value to them in any case, as it's unlikely that
the author will *know* about the kinds of conflicts they'd be
concerned about in their packaging process. But it would certainly
be worth asking them.
More to the point though... I wonder whose idea it was to have these
fields in the first place? Neither PEP 314 nor PEP 345 don't really
say, "Oh, such and such people asked for these fields for thus-and-so
use cases", and in the absence of such requestors and use cases, it
would probably be best just to drop them entirely. (Unless of course
Fred offers a description of what his actual use case for Conflicts
is/was, and it doesn't fall into one of the categories previously discussed.)
More information about the Catalog-SIG
mailing list