Почему "python setup.py sdist" создает нежелательные "PROJECT-egg.info" в корневом каталоге проекта?
Когда я запустил
python setup.py sdist
он создает sdist в моем каталоге. /dist. Это включает файл "PROJECT-egg.info" в zip внутри моей "dist" папки, которую я не использую, но мне это не мешает, поэтому я просто игнорирую его.
Мой вопрос в том, почему он также создает папку "PROJECT-egg.info" в корневом каталоге проекта? Могу ли я заставить его прекратить создание этого? Если нет, могу ли я просто удалить его сразу после создания sdist?
Я использую функцию 'setup', импортированную из setuptools.
WindowsXP, Python2.7, Setuptools 0.6c11, Распространение 0.6.14.
Моя конфигурация конфигурации выглядит так:
{'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}
Ответы
Ответ 1
Этот каталог создается намеренно как часть процесса сборки для исходного дистрибутива. Немного gander в руководстве разработчика для setuptools дает вам подсказку о том, почему:
Но, не забудьте игнорировать любую часть документация distutils, которая занимается с MANIFEST или как он сгенерирован от MANIFEST.in; щиты настройки вы от этих проблем и не работаете в любом случае. в отличие от distutils, setuptools восстанавливает файл манифеста источника распространения каждый раз, когда вы строите источник распределения, и он строит его внутри каталог проекта .egg-info, out пути вашего основного проекта каталог. Поэтому вам не нужно беспокоиться о том, является ли это актуальным или нет.
Вы можете безопасно удалить каталог после завершения сборки.
Бонусное редактирование:
Я настраиваю команду clean
в моем setup.py
на многих моих проектах Python для удаления *.egg-info
, dist
, build
и *.pyc
и других файлов. Вот пример того, как это делается в 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,
}
)
Чтобы проиллюстрировать, после запуска python setup.py build
в фиктивном проекте под названием "poop" (да, я очень зрелый), это происходит:
$ 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
И теперь, если мы запустим 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'
Тада!
Ответ 2
Обратите внимание, что артефакты PROJECT.egg-info
полностью исчезают из вашего sdist.
Команда setup.py egg_info
будет использовать исходный корень в качестве базы яиц по умолчанию, в результате каталог PROJECT.egg-info
будет упакован в sdist.
Вы можете настроить базу яиц, передав опцию --egg-base
.
Это создаст каталог PROJECT.egg-info
где-то в другом месте, оставив его полностью из исходного источника. Вы также можете использовать setup.cfg
для установки этого свойства.
Следующая команда для создания sdist без PROJECT.egg-info
работает для меня:
python setup.py egg_info --egg-base /tmp sdist
Или в setup.cfg
:
[egg_info]
egg_base = /tmp
Ответ 3
Папка -egg.info
не всегда является временным артефактом, который вы можете удалить.
Например, если вы используете pip install -e YOURPACKAGE
для "редактируемой" установки (работает через символическую ссылку, например python setup.py develop
, поэтому вам не нужно переустанавливать пакет каждый раз, когда вы его редактируете локально), -egg.info
папка требуется во время выполнения, когда ваш пакет импортируется в другой источник. Если он не существует, вы получите ошибку DistributionNotFound
.