2010-09-23 38 views
36

Khi tôi chạyTại sao "python setup.py sdist" tạo không mong muốn "PROJECT-egg.info" trong thư mục gốc của dự án?

python setup.py sdist 

nó tạo ra một sdist trong thư mục ./dist tôi. Điều này bao gồm một tập tin "PROJECT-egg.info" trong zip bên trong thư mục "dist" của tôi, mà tôi không sử dụng, nhưng nó không làm tổn thương tôi, vì vậy tôi chỉ bỏ qua nó.

Câu hỏi của tôi là tại sao nó cũng tạo thư mục "PROJECT-egg.info" trong thư mục gốc của dự án của tôi? Tôi có thể làm cho nó ngừng tạo ra điều này? Nếu không, tôi có thể xóa nó ngay lập tức sau khi tạo sdist không?

Tôi đang sử dụng chức năng 'thiết lập' được nhập từ công cụ thiết lập. WindowsXP, Python2.7, Setuptools 0.6c11, Phân phối 0.6.14.

thiết lập cấu hình của tôi trông giống như:

{'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} 
+0

FTR: Câu hỏi liên quan (nhưng không trùng lặp: câu hỏi này là về tệp thông tin trứng được tạo trong suốt sdist, thông tin khác về thông tin trứng được tạo trong khi cài đặt): http://stackoverflow.com/q/23460191/821378 –

Trả lời

47

Thư mục này được tạo ra cố ý như là một phần của quá trình xây dựng cho một phân phối nguồn. Một ngây ngô chút tại developer guide for setuptools mang đến cho bạn một gợi ý là tại sao:

Nhưng, hãy chắc chắn để bỏ qua bất kỳ một phần của tài liệu distutils rằng đề với MANIFEST hoặc làm thế nào nó được tạo ra từ MANIFEST.in; setuptools shields bạn từ những vấn đề này và không hoạt động theo cùng một cách trong mọi trường hợp. Không giống như các distutils, setuptools tái sinh các phân phối nguồn manifest tập tin mỗi khi bạn xây dựng một nguồn phân phối, và nó được xây dựng nó bên trong thư mục .egg-info của dự án, ra của con đường chính dự án thư mục của bạn. Do đó, bạn không cần phải lo lắng về việc liệu đó có phải là cập nhật hay không.

Bạn có thể xóa thư mục sau khi xây dựng xong.

Bonus chỉnh sửa:

tôi tùy chỉnh lệnh clean trong setup.py tôi trên nhiều dự án Python của tôi để xóa *.egg-info, dist, build, và *.pyc và các tập tin khác. Dưới đây là một ví dụ về cách nó được thực hiện trong 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, 
    } 
) 

Để minh họa, sau khi chạy python setup.py build trên một dự án giả gọi là "phân của" (Vâng, tôi rất trưởng thành), điều này xảy ra:

$ 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 

Và bây giờ nếu chúng tôi chạy 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!

+0

Nhiều cảm ơn vì sự thấu hiểu. Tôi không bao giờ có thể tìm ra liệu tôi có nên cọ rửa các tài liệu cho các distutils hoặc setuptools hoặc phân phối. Tôi sẽ treo một lúc trước khi chọn câu trả lời của bạn, chỉ trong trường hợp có cái gì đó giống như một kwarg tôi đã không phát hiện chưa nói với setuptools không làm điều này. –

+0

Vì vậy, tôi đã thêm dòng vào Makefile của mình để xóa * .egg-info trên 'make clean', hoặc sau khi thực hiện 'make sdist'. Cảm ơn bạn đã trấn an tôi, điều này không nhất thiết phải phá vỡ mọi thứ. –

+1

Bạn được chào đón. Đó chính xác là những gì tôi làm từ bên trong 'setup.py' của tôi. Tôi rất vui vì tôi đã có thể giúp đỡ! :) – jathanism

8

Lưu ý rằng bạn có thể có các hiện vật PROJECT.egg-info biến mất hoàn toàn khỏi danh sách phát của mình.

Lệnh setup.py egg_info sẽ sử dụng gốc nguồn làm cơ sở trứng theo mặc định, dẫn đến thư mục PROJECT.egg-info được đóng gói vào sdist.

Bạn có thể định cấu hình cơ sở trứng bằng cách chuyển tùy chọn --egg-base. Thao tác này sẽ tạo thư mục PROJECT.egg-info ở một nơi khác, để nó hoàn toàn khỏi phân phối nguồn của bạn. Bạn cũng có thể sử dụng một số setup.cfg để đặt thuộc tính đó.

Lệnh sau đây để tạo ra một sdist mà không có một PROJECT.egg-info công trình cho tôi:

python setup.py egg_info --egg-base /tmp sdist 

Hoặc trong một setup.cfg:

[egg_info] 
egg_base = /tmp 
+1

Đáng buồn thay, 'settools' cố ý phá vỡ hỗ trợ cho các tên đường dẫn' egg_base' tuyệt đối tại một số điểm. Lỗi nghiêm trọng sau đây được phát ra: các đối số 'setup() phải * luôn luôn * là các đường dẫn/-parparated liên quan đến thư mục setup.py, * never * absolute paths.' * Sigh. * –

9

Thư mục -egg.info không phải là luôn luôn là một vật tạm thời bạn có thể xóa . Ví dụ: nếu bạn sử dụng pip install -e YOURPACKAGE để cài đặt "có thể chỉnh sửa" (hoạt động qua liên kết tượng trưng như python setup.py develop để bạn không phải cài đặt lại gói mỗi lần chỉnh sửa cục bộ), thư mục -egg.info là bắt buộc khi chạy khi gói của bạn được nhập vào một nguồn khác. Nếu nó không tồn tại, bạn sẽ nhận được một lỗi DistributionNotFound.

+0

điều cần biết, tôi sử dụng . Cảm ơn. –

Các vấn đề liên quan