2015-02-13 15 views
17

TL; DR: Có cách nào để cài đặt 'phát triển' của setuptool để cài đặt một bộ yêu cầu phát triển khi chạy python setup.py develop không?Setuptools "development" Yêu cầu

Tôi đang xây dựng gói python đầu tiên của mình bằng cách sử dụng các công cụ thiết lập. Tôi xác định các yêu cầu như:

requirements = [ 
    'click', 
    'ansible', 
    'fabric', 
    'gitpython', 
    'pyyaml', 
    'jinja2', 
    'yapsy' 
] 

test_requirements = [ 
    'pytest', 
    'pytest-pep8', 
    'pytest-cov', 
] 

setup(
... 
    install_requires=requirements, 
    tests_require=test_requirements, 
... 
) 

Trong phát triển, tôi đã cài đặt gói (trong một môi trường ảo) với:

python setup.py develop 

và gỡ bỏ cài đặt với:

python setup.py develop -u 

Gói này sử dụng entry_points để cài đặt một số kịch bản dòng lệnh, do đó, thiết lập các lệnh cho tôi và cho phép tôi chỉnh sửa gói trong khi kiểm tra lệnh cùng một lúc.

Tôi cũng có một số phụ thuộc mà tôi sử dụng để phát triển ... sphinx + extensions và một vài thứ khác (những thứ không cần thiết để sử dụng gói). Tôi chỉ cần tự cài đặt chúng trong môi trường ảo tại thời điểm này. Tôi không thấy bất kỳ tài liệu nào (và chưa tìm thấy bất kỳ ví dụ nào về googles) về cách liên kết chúng với các công cụ thiết lập.

Có thể có cách để móc 'setup.py phát triển' để cài đặt một bộ yêu cầu bổ sung? Một phương pháp khác mà tôi chưa đọc?

+1

Vì mục đích phát triển, tôi khuyên bạn nên sử dụng 'requirements.txt' để ghim gói phiên bản cho môi trường phát triển, sau đó chạy' pip install -r requirements.txt' để triển khai môi trường đó. Đó là loại trường hợp sử dụng ở đó. – Iguananaut

Trả lời

26

Để biết thêm thông tin về cách sử dụng setup.py so với requirements.txt, tôi đã tìm thấy this article hữu ích.

Cập nhật: tháng 9 năm 2016

tôi không còn sử dụng requirements.txt (xem câu trả lời ban đầu dưới đây) để cài đặt phát triển chỉ gói. Sự khôn ngoan hiện tại có vẻ là requirements.txt nên được sử dụng để ghim triển khai cho các số phiên bản cụ thể, thường sử dụng pip freeze > requirements.txt. Điều này đảm bảo rằng các phiên bản chính xác của các phụ thuộc của dự án của bạn và các phụ thuộc của phụ thuộc vào dự án của bạn được cài đặt trên tất cả các máy chủ của bạn.

Tôi thay vì sử dụng tùy chọn extras_require để setup.

requirements = [ 
    'click', 
    'ansible', 
    'fabric', 
    'gitpython', 
    'pyyaml', 
    'jinja2', 
    'yapsy' 
] 

setup({ 
    install_requires=requirements, 
    extras_require={ 
     'dev': [ 
      'pytest', 
      'pytest-pep8', 
      'pytest-cov' 
     ] 
    } 
}) 

Bây giờ, để cài đặt gói của bạn để phát triển, bạn chạy pip install -e .[dev]. Cài đặt này sẽ cài đặt tất cả các gói yêu cầu thông thường các gói được liệt kê trong phần dev của extras_require.

Cài đặt sản xuất vẫn có thể được thực hiện với python setup.py install hoặc pip install . (hoặc với tệp requirements.txt).

gốc trả lời

Đây là một cách để làm điều đó mà có vẻ là phù hợp với các khuyến nghị tôi đã chạy vào về setup.py vs requirements.txt. Chỉ định tất cả các phụ thuộc sản xuất của bạn trong thông số install_requires của setup.py.

requirements = [ 
    'click', 
    'ansible', 
    'fabric', 
    'gitpython', 
    'pyyaml', 
    'jinja2', 
    'yapsy' 
] 

setup({ 
    # ... 
    install_requires=requirements 
    # ... 
}) 

Sau đó tạo một file requirements.txt rằng chỉ thị pip để cài đặt phụ thuộc sản xuất của bạn từ setup.py cũng như phụ thuộc kiểm tra của bạn.

-e . 

pytest 
pytest-pep8 
pytest-cov 

Bây giờ bạn có thể cài đặt gói của mình để phát triển với pip install -r requirements.txt. Dòng -e . sẽ cài đặt gói của bạn và phụ thuộc của gói từ setup.py trong chế độ phát triển. Để cài đặt vào sản xuất, bạn có thể sử dụng python setup.py install hoặc pip install .. Điều này sẽ chỉ cài đặt các phụ thuộc được liệt kê trong setup.py.

+3

Điều này có thể gây nhầm lẫn cho các triển khai giống như Heroku, mặc dù, khi chúng sử dụng 'requirements.txt' cho các yêu cầu sản xuất. – Ale

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