2013-03-15 22 views
26

Đây là cách tôi làm điều đó hiện:Thực tiễn tốt nhất: cách bạn liệt kê các phụ thuộc bắt buộc trong setup.py?

import os 
from setuptools import setup, find_packages 
here = os.path.abspath(os.path.dirname(__file__)) 

requires = [ 
    'pyramid', 
    'pyramid_debugtoolbar', 
    'waitress', 
    'requests', 
    'mock', 
    'gunicorn', 
    'mongoengine', 
    ] 

setup(name='repoapi', 
     version='0.0', 
     description='repoapi', 
     packages=find_packages(), 
     include_package_data=True, 
     zip_safe=False, 
     install_requires=requires, 
     tests_require=requires, 
     test_suite="repoapi", 
     entry_points="""\ 
     [paste.app_factory] 
     main = repoapi:main 
     """, 
    ) 

Đây có phải là một cách được không? Tôi có một số rắc rối. Ví dụ, đối với kim tự tháp, tôi không thể sử dụng plugin nosetests toàn hệ thống để chạy thử nghiệm. Tôi cần phải cài đặt pyramid trong gói trang web trăn toàn cầu!

Nhưng tôi không muốn điều đó. Vì vậy, tôi phải cài đặt mũi trong virtualenv của dự án này. Nhưng tôi không muốn nó là một sự phụ thuộc. Tôi không cảm thấy nó thuộc về requires. Nó không phải là. Tuy nhiên, tôi cũng không muốn cài đặt bằng tay mọi lúc. Vâng, tôi biết tôi có rất nhiều điều tôi không muốn làm điều này và ...

Nhưng bạn sẽ giải quyết điều đó như thế nào? Tôi không muốn làm xáo trộn các gói site python toàn cầu, nhưng tôi muốn cài đặt mũi như một phần của virtualenv.

Ngoài ra, tệp yêu cầu cài đặt pip. Nó chính xác hơn một chút vì tôi không cần phải chỉ định phiên bản theo cách thủ công và tôi không cần phải sợ cập nhật setup.py theo cách thủ công. Chỉ cần ném pip freeze > file.txt và hoàn tất.

Tuy nhiên, pip có thể trả lại rác vì chúng tôi vứt gói rác vào virtualenv.

Rất nhiều lưỡi dao. Thực hành tốt nhất là gì? Làm thế nào để bạn đối phó với những vấn đề này?

Có thể tôi đã bỏ lỡ nó, nhưng https://github.com/django/django/blob/master/setup.py, Django đã làm như thế nào?

Trả lời

43

Bạn có thể chia ra các yêu cầu của bạn vào "cài đặt" phụ thuộc và "test" phụ thuộc như thế này:

import os 
from setuptools import setup, find_packages 
here = os.path.abspath(os.path.dirname(__file__)) 

install_requires = [ 
    'pyramid', 
    'pyramid_debugtoolbar', 
    'waitress', 
    'requests', 
    'gunicorn', 
    'mongoengine', 
    ] 

tests_require = [ 
    'mock', 
    'nose', 
    ] 

setup(name='repoapi', 
     ... 
     install_requires=install_requires, 
     tests_require=tests_require, 
     test_suite="nose.collector", 
     ... 
    ) 

Bằng cách này, khi ai đó cài đặt các gói, chỉ có "cài đặt" phụ thuộc được cài đặt. Vì vậy, nếu ai đó chỉ muốn sử dụng gói (và họ không quan tâm đến việc chạy thử nghiệm), thì họ không phải cài đặt các phụ thuộc thử nghiệm.

Khi bạn muốn chạy các bài kiểm tra, bạn có thể sử dụng này:

$ python setup.py test 

mỗi sự docs:

Lưu ý rằng các dự án này cần thiết sẽ không được cài đặt trên hệ thống mà các bài kiểm tra được chạy, nhưng chỉ được tải xuống thư mục thiết lập của dự án nếu chúng chưa được cài đặt cục bộ.

Khi phụ thuộc "thử nghiệm" được đặt ra, sau đó nó sẽ chạy lệnh "test_suite". Vì bạn đã đề cập đến mũi làm Á hậu thử nghiệm ưa thích của mình, tôi đã chỉ ra cách bạn use "nose.collector" định cấu hình đó.

Ngẫu nhiên, setup.py của Django không phải là ví dụ rõ ràng nhất để hiểu các khái niệm cơ bản về công cụ thiết lập. Tôi nghĩ rằng Sentry setup.py là một ví dụ tốt hơn để học hỏi.

+0

Cảm ơn bạn đã chia sẻ. Nhưng sẽ không thực sự được cài đặt vào virtualenv? Vì vậy, vào cuối ngày, các phương pháp hay nhất vẫn là tài liệu, vé lỗi để giữ cho setup.py được đồng bộ hóa? Cảm ơn. – CppLearner

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