2015-03-13 18 views
12

Tôi làm cách nào để bao gồm package_data cho sdist mà không có tệp MANIFEST.in?Tôi làm cách nào để bao gồm package_data không có tệp MANIFEST.in?

setup.py của tôi trông như thế này:

import setuptools 

setuptools.setup(
    name='foo', 
    version='2015.3', 
    license='commercial', 
    packages=setuptools.find_packages(), 

    package_data={'': ['foo/bar.txt']}, 
) 

phiên bản:

[email protected]> python 
Python 2.7.6 (default, Mar 22 2014, 22:59:56) 
>>> import setuptools 
>>> setuptools.version.__version__ 
'3.6' 

Tôi chỉ có thể không nhận được foo/bar.txt bao gồm.

Hoặc là this blog post vẫn đúng? http://blog.codekills.net/2011/07/15/lies,-more-lies-and-python-packaging-documentation-on--package_data-/

Trong giờ qua, tôi đã học được rằng những câu này nằm ở đâu đó giữa "gây nhầm lẫn nguy hiểm" và "dối trá". Điều này là do loại gói Python chính là gói nguồn và phương pháp chuẩn để tạo gói nguồn là sử dụng setup.py sdist. Tuy nhiên, dữ liệu được chỉ định trong package_data không được bao gồm trong các bản phân phối nguồn - chúng chỉ được bao gồm trong các bản phân phối và cài đặt nhị phân (setup.py bdist) (setup.py install).

Làm cách nào để bao gồm package_data cho sdist mà không có tệp MANIFEST.in?

Trả lời

23

TL; DR: Các phím trong package_data điển là gói; các giá trị là danh sách các globs. '' không phải là tên hợp lệ cho bất kỳ gói Python nào.

Nếu bạn muốn có bar.txt được cài đặt bên cạnh __init__.py của gói foo, sử dụng

package_data={'foo': ['bar.txt']} 

Tôi có cách bố trí:

foo/ 
     __init__.py 
     bar.txt 
setup.py 

Bây giờ, nếu foo là một gói phần mềm như trên, làm:

import setuptools 

setuptools.setup(
    name='foo', 
    version='2015.3', 
    license='commercial', 
    packages=setuptools.find_packages(), 
    package_data={'foo': ['bar.txt']}, 
) 

Và sau python setup.py sdist, tôi kiểm tra các nội dung của dist/foo-2015.3.tar.gz

% tar tfz dist/foo-2015.3.tar.gz 
... 
foo-2015.3/foo/bar.txt 
... 

Tuy nhiên, nếu tôi chạy của bạn setup.py với package_data={'': ['foo/bar.txt']}, tôi có thể đồng tình rằng foo/bar.txt sẽ không được thêm vào sự phân bố nguồn, trừ nếu foo-2015.3.egg-info/SOURCES.txt đã có dòng cho foo/bar.txt - trong trường hợp đó, tệp sẽ xuất hiện trong phân phối nguồn quá

Không có tệp kê khai nào được sử dụng; phiên bản setuptools là 3.6 (tôi cố tình cài đặt cùng một phiên bản, cũ mà bạn đang sử dụng):

>>> import setuptools 
>>> setuptools.__version__ 
'3.6' 

Các hành vi trên cũng làm việc trong tiêu chuẩn distutils: 2.6 Installing package data của tài liệu distutils "di sản"; với một bình luận cho 2.7, 3.1:

Thay đổi trong phiên bản [2.7, 3.1]: Tất cả các tập tin phù hợp với package_data sẽ được thêm vào tập tin MANIFESTnếu không có mẫu được cung cấp.

+1

Cảm ơn cho câu trả lời chi tiết. Thật không may, tôi chỉ cần làm theo các hướng dẫn này nguyên văn và 'bar.txt' không xuất hiện trong' foo-2015.3.tar.gz'. Bạn đề cập đến cố ý bằng cách sử dụng phiên bản cũ của các công cụ thiết lập, nhưng bạn không nói tại sao. Điều đó có thể giải thích tại sao nó không hoạt động? –

5

tôi đã cùng một vấn đề và cố định nó được loại bỏ:

include_package_data=True 
Các vấn đề liên quan