[Zope-dev] Re: [Plone-developers] zcml entry points
Chris McDonough
chrism at plope.com
Tue Oct 23 18:21:31 EDT 2007
On Oct 22, 2007, at 11:46 AM, Lennart Regebro wrote:
> On 10/22/07, Martijn Faassen <faassen at startifact.com> wrote:
>> In at least 3 places we express dependency information. For different
>> *purposes* in each case, but we still state something like:
>>
>> 1. "we use dependency X, and please download and install it"
>> 2. "we use dependency X, please configure it"
>> 3. "we use dependency X, please import the following from it"
>>
>> It'd be nice if I only had to say "I want to import from
>> dependency X,
>> please make sure it's there and available." Actually this is a little
>> bit like zc.resourcelibrary can make resources appear on your page
>> headers when you write code that needs it.
>>
>> Of course this is sometimes not possible, as there's not enough
>> information available, or there are multiple separate ways to
>> configure it.
>
> In the end I guess this all is just more arguments for separating the
> functions and the views into separate eggs.
I think maybe more abstractly, it might be useful to think about
separating based on libraries vs. applications. Libraries should be
as policy-free as possible (otherwise they're not libraries, they're
applications). Applications, however, must declare policies (or they
would be useless, this is what makes them applications [sorry for the
reflexive tautology]), but this makes them not useful outside of some
context. If a library egg contains an entry point that either loaded
or returned a stream for the moral equivalent of meta.zcml, that
would be fine. But it would be less OK for an egg which represented
a library's ZCML to contain adapter and utlity registrations.
However, if the egg represented an application, it would be fine for
it to do either.
Zope 2 'Products' are usually applications in a sense, because they
are *never* useful outside the context of Zope-the-application-
server, and that's why Five's automagical load of "meta",
"configure", and "overrides" ZCML is completely appropriate for them,
and why it would make sense, if products became eggs, to have all of
their ZCML loaded at Zope startup time. However, the presence of
some ZCML in a non-Product library doesn't mean that its ZCML should
be loaded, IMO. Zope-3-the-application uses site.zcml to selectively
load configurations, and I think that's about the right policy. We
could devise some way of spelling the equivalent of site.zcml as an
entry point for eggs-that-are-applications, and as any "include
package" directives in that zcml should "just work", there probably
shouldn't be any additional machinery within zcml itself to cause
other ZCML to be loaded from multiple packages via some omnibus
search pattern.
We don't really complain too badly right now that setuptools doesn't
infer all of our dependencies for us from import statements in the
packages it contains in order to prevent us from having to manually
specify dependencies in our setup.py. This is because even though it
probably could (py2exe does something like this), it's more trouble
than it's worth in because the import statements themselves don't
contain enough information (version, location, is it an absolute
requirement or a nice-to-have?) if you want to treat the dependencies
as independently release-managed entities. That said, if you just
want to "freeze" some configuration up, it would become reasonable to
treat some sandbox as a fully-configured set of things that should
get packaged up as a glob and shipped off, but this is the opposite
of what we want to do with eggs in the long term, I think.
- C
More information about the Zope-Dev
mailing list