2012-03-07 36 views
27

Trong một cuộc thập tự chinh để làm cho đơn đăng ký của tôi pip-cài đặt được, tôi đang chiến đấu với những trận đánh lớn với setuptoolsdistribute. Tôi cho rằng các phụ thuộc của tôi là chính xác, tức là cài đặt với pip install myapp có lẽ nên điền chính xác môi trường ảo. Tuy nhiên, tôi muốn sắp xếp phát triển trong khi tôi ở đó, vì vậy mục tiêu của tôi là bắt đầu với một số trống virtualenv và tạo setup.py test (và sau này là setup.py develop, nhưng đó là một cuộc chiến hoàn toàn khác).Làm cách nào để buộc `setup.py test` cài đặt các phụ thuộc vào` virtualenv` của tôi?

Và bây giờ cho vấn đề của tôi: không có vấn đề làm thế nào tôi cố gắng, tất cả tôi nhận được phụ thuộc được cài đặt như .egg s trong thư mục dự án của tôi mà là tối ưu phụ ít nhất. Tôi đã cố gắng tạo ra một lệnh mới setuptools mà sẽ sử dụng pip (mà dường như làm việc, mặc dù vụng về) nhưng điều đó không thể nghiêm túc là giải pháp (subclassing và ghi đè đó là).

Vậy làm cách nào để tạo setup.py test điền vào virtualevn thay vì thư mục làm việc của tôi?

+0

Bạn có thể thêm đầu ra của lệnh 'python setup.py develop' vào câu hỏi không? Khi tôi chạy nó trong virtualenv, nó sẽ cài đặt các phụ thuộc vào virtualenv của tôi. – Chris

+0

@Chris: không phụ thuộc vào 'tests_requires'. – Flimm

Trả lời

11

Theo thiết kế, bạn không thể thực hiện các mục nhập tests_requires hoặc setup_requires đi vào môi trường ảo. Ý tưởng là để tách riêng những gì được yêu cầu để thực hiện kiểm tra/thiết lập và những gì được yêu cầu để thực sự sử dụng gói đang được cài đặt. Ví dụ, tôi có thể yêu cầu mô-đun "bảo hiểm" cần thiết để chạy thử nghiệm trên gói của tôi, nhưng nó không được sử dụng bởi bất kỳ mã nào của tôi trong gói. Vì vậy, nếu tôi không có "bảo hiểm" trong môi trường của tôi khi tôi đi và chạy thử nghiệm, tôi sẽ không muốn "bảo hiểm" để có được cài đặt vào môi trường nếu gói của tôi không cần nó.

+2

Vậy thì mục đích của tests_requires là gì? –

+2

Trong một số trường hợp, các thử nghiệm của bạn có thể có một sự phụ thuộc bổ sung mà gói của bạn không có để thực hiện các thử nghiệm của nó. Một ví dụ cụ thể là gói "mũi", có thể không bao giờ được sử dụng ở bất kỳ nơi nào khác trong dự án của bạn mà là các bài kiểm tra. Điều này cho phép bạn chỉ gửi gói mà không cần kiểm tra và không gây gánh nặng cho người dùng của bạn với các phụ thuộc không cần thiết để làm cho gói hoạt động. –

+4

Tôi có nghĩa là mục đích của test_requires nếu nó chỉ bị bỏ qua ... Tôi đã hoàn toàn bỏ lỡ rằng nó không bị bỏ qua khi làm 'setup.py tests'/hành vi venv có vẻ đáng ngạc nhiên, tôi hiểu nó không được mặc định nhưng bạn sẽ có thể buộc pip cài đặt test_requires ... http: // stackoverflow.com/a/15422703/1240268 –

-5

Nếu bạn đang sử dụng setuptools, bạn có thể chỉ định phụ thuộc thử nghiệm bằng cách sử dụng đối số từ khóa tests_require cho phương thức setup.

from setuptools import setup 

setup(
    name='your-package-name', 
    version='1.0.0', 
    author='me', 
    author_email='[email protected]', 
    install_requires=['Pygments>=1.4'], 
    tests_require=['nose'], 
    packages=[ 
     'your_package_name', 
    ], 
) 

Khi bạn chạy python setup.py test, điều này sẽ kiểm tra nose và cài đặt nó vào hiện đang hoạt động virtualenv sử dụng pip nếu không đã có sẵn.

Lưu ý rằng đối số này sẽ bị bỏ qua nếu bạn đang sử dụng distribute.core.setup (cũng không có lệnh test).

+0

Nó không sử dụng pip trong kinh nghiệm của tôi. – Flimm

+0

Đây chính xác là những gì OP đã làm - kết thúc với các thư mục .egg trên – UloPe

+5

Câu trả lời này rõ ràng là không chính xác. [Doc] (http://pythonhosted.org/setuptools/setuptools.html#new-and-changed-setup-keywords) nói rằng các công cụ thiết lập sẽ sử dụng EasyInstall để cài đặt các gói 'tests_require' vào" thư mục thiết lập của dự án ", bất cứ điều gì có thể có nghĩa là. – bukzor

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