On Sat, Jul 20, 2013 at 2:10 AM, Nick Coghlan <ncogh...@gmail.com> wrote: > On 20 July 2013 01:47, PJ Eby <p...@telecommunity.com> wrote: >> On Fri, Jul 19, 2013 at 9:10 AM, Nick Coghlan <ncogh...@gmail.com> wrote: >>> Right, I think the reasonable near term solutions are for pip to either: >>> >>> 1. generate zc.buildout style wrappers with absolute paths to avoid >>> the implied runtime dependency >>> 2. interpret use of script entry points as an implied dependency on >>> setuptools and install it even if not otherwise requested >>> >>> Either way, pip would need to do something about its *own* command >>> line script, which heavily favours option 1 >> >> Option 1 also would address some or all of the startup performance complaint. >> >> It occurs to me that it might actually be a good idea *not* to put the >> script wrappers in the standard entry points file, even if that's what >> setuptools does right now: if lots of packages use that approach, >> it'll slow down the effective indexing for code that's scanning >> multiple packages for something like a sqlalchemy adapter. >> >> (Alternately, we could use something like >> 'exports-some.group.name.json' so that each export group is a separate >> file; this would keep scripts separate from everything else, and >> optimize plugin searches falling in a particular group. In fact, the >> files needn't have any contents; it'd be okay to just parse the main >> .json for any distribution that has exports in the group you're >> looking for. i.e., the real purpose of the separation of entry points >> was always just to avoid loading metadata for distributions that don't >> have the kind of exports you're looking for. In the old world, few >> distributions exported anything, so just identifying whether a >> distribution had exports was sufficient. In the new world, more and >> more distributions over time will have some kind of export, so knowing >> *which* exports they have will become more important.) > > A not-so-quick sketch of my current thinking: > > Two new fields in PEP 426: commands and exports > > Like the core dependency metadata, both get generated files: > pydist-commands.json and pydist-exports.json > > (As far as the performance concern goes, I think longer term we'll > probably move to a richer installation database format that includes > an SQLite cache file managed by the installers. But near term, I like > the idea of being able to check "has commands or not" and "has exports > or not" with a single stat call for the appropriate file) > > Rather than using the "module.name:qualified.name" format (as the PEP > currently does for the install_hooks), "export specifiers" would be > defined as a mapping with the following subfields: > > * module > * qualname (as per PEP 3155) > * extra > > Both qualname and extra would be optional. "extra" indicates that the > export is only present if that extra is installed. > > The top level commands field would have three subfields: > "wrap_console", "wrap_gui" and "prebuilt". The wrap_console and > wrap_gui subfields would both be maps of command names to export > specifiers (i.e. requests for an installer to generate the appropriate > wrappers), while prebuilt would be a mapping of command names to paths > relative to the scripts directory (as strings). > > Note that given that Python 2.7+ and 3.2+ can execute packages with a > __main__ submodule, the export specifier for a command entry *may* > just be the module component and it should still work. > > The exports field is just a rebranded and slightly rearranged > entry_points structure: the top level keys in the hash map are "export > groups" (defined in the same way as metadata extensions are defined) > and the individual entries in each export group are arbitrary keys > (meaning determined by the export group) mapping to export specifiers. > > With this change, I may even move the current top level > "install_hooks" field inside the "exports" field. Even if it stay at > the top level, the values will become export specifiers rather than > using the entry points string format. > > Not sure when I'll get that tidied up and incorporated into a new > draft of PEP 426, but I think it covers everything. > > For those wondering about my dividing line between "custom string > format" and "structured data": the custom string formats in PEP 426 > should be limited to things that are likely to be passed as command > line arguments (like requirement specifiers and their assorted > components), or those where using structured data would be > extraordinarily verbose (like environment markers). If I have any > custom string formats still in there that don't fit either of those > categories, then let me know and I'll see if I can replace them with > structured data. > > Cheers, > Nick.
It may be worth mentioning that I am not aware of any package that uses the "entry point requires extra" feature. IIUC pkg_resources doesn't just check whether something's installed but attempts to add the requirements of the entry point's distribution and any requested extras to sys.path as part of resolution. _______________________________________________ Distutils-SIG maillist - Distutils-SIG@python.org http://mail.python.org/mailman/listinfo/distutils-sig