¿Por qué "python setup.py sdist" crea un "PROJECT-egg.info" no deseado en el directorio raíz del proyecto?
setuptools distutils (4)
Cuando corro
python setup.py sdist
crea un sdist en mi directorio ./dist. Esto incluye un archivo "PROJECT-egg.info" en el zip dentro de mi carpeta "dist", que no uso, pero no me duele, así que simplemente lo ignoro.
Mi pregunta es ¿por qué también crea una carpeta "PROJECT-egg.info" en el directorio raíz de mi proyecto? ¿Puedo hacer que deje de crear esto? Si no, ¿puedo simplemente eliminarlo inmediatamente después de crear el sdist?
Estoy usando la función ''configuración'' importada desde setuptools. WindowsXP, Python2.7, Setuptools 0.6c11, Distribuir 0.6.14.
Mi configuración de configuración se ve así:
{''author'': ''Jonathan Hartley'',
''author_email'': ''[email protected]'',
''classifiers'': [''Development Status :: 1 - Planning'',
''Intended Audience :: Developers'',
''License :: OSI Approved :: BSD License'',
''Operating System :: Microsoft :: Windows'',
''Programming Language :: Python :: 2.7''],
''console'': [{''script'': ''demo.py''}],
''data_files'': [(''Microsoft.VC90.CRT'',
[''..//lib//Microsoft.VC90.CRT//Microsoft.VC90.CRT.manifest'',
''..//lib//Microsoft.VC90.CRT//msvcr90.dll''])],
''description'': ''Utilities for games and OpenGL graphics, built around Pyglet./n'',
''keywords'': '''',
''license'': ''BSD'',
''long_description'': "blah blah blah",
''name'': ''pygpen'',
''options'': {''py2exe'': {''ascii'': True,
''bundle_files'': 1,
''dist_dir'': ''dist/pygpen-0.1-windows'',
''dll_excludes'': [],
''excludes'': [''_imaging_gif'',
''_scproxy'',
''clr'',
''dummy.Process'',
''email'',
''email.base64mime'',
''email.utils'',
''email.Utils'',
''ICCProfile'',
''Image'',
''IronPythonConsole'',
''modes.editingmodes'',
''startup'',
''System'',
''System.Windows.Forms.Clipboard'',
''_hashlib'',
''_imaging'',
''_multiprocessing'',
''_ssl'',
''_socket'',
''bz2'',
''pyexpat'',
''pyreadline'',
''select'',
''win32api'',
''win32pipe'',
''calendar'',
''cookielib'',
''difflib'',
''doctest'',
''locale'',
''optparse'',
''pdb'',
''pickle'',
''pyglet.window.xlib'',
''pyglet.window.carbon'',
''pyglet.window.carbon.constants'',
''pyglet.window.carbon.types'',
''subprocess'',
''tarfile'',
''threading'',
''unittest'',
''urllib'',
''urllib2'',
''win32con'',
''zipfile''],
''optimize'': 2}},
''packages'': [''pygpen''],
''scripts'': [''demo.py''],
''url'': ''http://code.google.com/p/edpath/'',
''version'': ''0.1'',
''zipfile'': None}
El sistema de empaquetado y construcción de pitones se rompe en mi humilde opinión. Entonces, hay muchos hacks y soluciones para cosas que uno cree que funcionan de la caja.
Sin embargo, el truco "más limpio" que encontré para eliminar el * .egg-info es usar el clean --all
normal clean --all
interruptor junto con el egg_info
para colocar el archivo * .egg-info en una subcarpeta que se limpiará con el comando limpiar . Aquí un ejemplo:
En su setup.cfg
use algo como esto:
[egg_info]
egg_base = ./build/lib
donde ./build/lib
es una carpeta que se clean --all
se eliminarán. Luego, cuando construyas tu proyecto con las herramientas de configuración, utiliza el comando limpiar con la marca --toda, por ejemplo
python setup.py bdist_wheel clean --all
si también desea compilar un paquete fuente, asegúrese de compilar bdist_wheel antes de sdist para que exista la carpeta compilación / lib, por ejemplo:
python setup.py bdist_wheel sdist clean --all
Este directorio se crea intencionalmente como parte del proceso de compilación para una distribución fuente. Un pequeño vistazo a la guía del desarrollador para setuptools le da una pista de por qué:
Pero, asegúrese de ignorar cualquier parte de la documentación de distutils que trate con MANIFEST o cómo se genera desde MANIFEST.in; setuptools lo protege de estos problemas y no funciona de la misma manera en ningún caso. A diferencia de los distutils, setuptools regenera el archivo de manifiesto de distribución de origen cada vez que compila una distribución de origen, y lo construye dentro del directorio .egg-info del proyecto, fuera del camino del directorio de su proyecto principal. Por lo tanto, no necesita preocuparse por si está actualizado o no.
Puede eliminar el directorio de forma segura después de que se haya completado su compilación.
Edición de bonificación:
Personalizo el comando clean
en mi setup.py
en muchos de mis proyectos de Python para eliminar *.egg-info
, dist
, build
y *.pyc
y otros archivos. Aquí hay un ejemplo de cómo se hace en setup.py
:
import os
from setuptools import setup, Command
class CleanCommand(Command):
"""Custom clean command to tidy up the project root."""
user_options = []
def initialize_options(self):
pass
def finalize_options(self):
pass
def run(self):
os.system(''rm -vrf ./build ./dist ./*.pyc ./*.tgz ./*.egg-info'')
# Further down when you call setup()
setup(
# ... Other setup options
cmdclass={
''clean'': CleanCommand,
}
)
Para ilustrar, después de ejecutar python setup.py build
en un proyecto ficticio llamado "poop" (Sí, estoy muy maduro), esto sucede:
$ python setup.py build
running build
running build_py
creating build
creating build/lib
creating build/lib/poop
copying poop/__init__.py -> build/lib/poop
Y ahora si ejecutamos python setup.py clean
:
$ python setup.py clean
running clean
removed `./build/lib/poop/__init__.py''
removed directory: `./build/lib/poop''
removed directory: `./build/lib''
removed directory: `./build''
Tada!
La carpeta -egg.info
no siempre es un artefacto temporal que puede eliminar.
Por ejemplo, si usa pip install -e YOURPACKAGE
para una instalación "editable" (funciona a través de symlink como python setup.py develop
para que no tenga que volver a instalar un paquete cada vez que lo edite localmente), el -egg.info
Se requiere una carpeta -egg.info
en tiempo de ejecución cuando su paquete se importa en otra fuente. Si no existe, obtendrá un error de DistributionNotFound
.
Tenga en cuenta que puede hacer que los artefactos PROJECT.egg-info
desaparezcan por completo de su sdist.
El comando setup.py egg_info
usará la raíz de origen como la base de huevo de forma predeterminada, lo que PROJECT.egg-info
resultado que el directorio PROJECT.egg-info
se empaquete en el sdist.
Puede configurar la base de huevo pasando la opción --egg-base
. Esto creará el directorio PROJECT.egg-info
en otro lugar, dejándolo fuera de la distribución de su fuente por completo. También puede usar setup.cfg
para establecer esa propiedad.
El siguiente comando para crear un sdist sin un PROJECT.egg-info
funciona para mí:
python setup.py egg_info --egg-base /tmp sdist
O en un setup.cfg
:
[egg_info]
egg_base = /tmp