2011-12-19 36 views
14

Tôi khá mới đối với các công cụ thiết lập. Tôi đã nhìn thấy một vài câu hỏi tương tự và nó lái xe một chút điên rồ mà tôi dường như làm theo lời khuyên tôi thấy nhưng setuptools vẫn làm một cái gì đó khác với những gì tôi muốn.các vấn đề về thiết lập - ngoại trừ các gói, bao gồm các tệp dữ liệu

Dưới đây là cấu trúc của dự án của tôi:

. 
.. 
package1/ 
    __init__.py 
    abc.py 
    ... 
tests/ 
    __init__.py 
    test_package1.py 
LICENSE 
README.md 
RELEASE 
setup.py 

Và đây là nội dung của setup.py của tôi:

#!/usr/bin/env python 
import os 
#from distutils.core import setup 
from setuptools import setup, find_packages 

setup(
    name='package1', 
    version='1.1', 
    test_suite="tests", 
    packages=find_packages(exclude=['tests']),  
    include_package_data=True, 
    package_data = { 
     '': ['LICENSE', 'README.md5', 'RELEASE'] 
    }, 
) 

Ngoài ra, trong file manifest của tôi, tôi có:

include LICENSE 
include RELEASE 
include README.md 

Tôi tạo tar với:

python setup.py sdist 

Tôi muốn:

  1. Loại trừ tests thư mục từ sự phân bố nguồn;
  2. Có LICENSE, README.md, RELEASE tệp trong thư mục gói trang web, ở cấp cao nhất hoặc bên trong thư mục package1 (tại thời điểm này, tôi sẽ đồng ý).

Thay vào đó, đây là những gì sẽ xảy ra:

  1. tests thư mục vẫn là trong kho lưu trữ tar tạo ra và được cài đặt vào trang web gói;
  2. Tệp được sao chép vào lưu trữ nhưng không được cài đặt vào thư mục được đóng gói trang web của gói.

Tôi hết ý tưởng, ai đó có thể giải thích cho tôi những gì tôi đang làm sai và cách khắc phục?

+1

tại sao python không yêu chúng ta ... Đó là một nhiệm vụ rất đơn giản và phổ biến: _ignore nhiều file, và bao gồm một số tệp phổ biến đến gói_. Tại sao nó khó khăn như vậy để làm gì? – maxkoryukov

Trả lời

15

Bạn nên tạo một file mới có tên gọi MANIFEST.in ở cấp độ gốc của gói của bạn, sau đó làm theo các hướng dẫn sau:

  1. Để kiểm soát tệp nào kết thúc trong tệp tar của bạn, hãy tạo tệp mới có tên là MANIFEST.in ở cấp cơ sở của gói của bạn. Ví dụ: bạn có thể loại trừ toàn bộ thư mục khỏi phân phối của mình bằng cách sử dụng recursive-exclude trong tệp MANIFEST.in.Trong trường hợp của bạn, bạn cần phải tập MANIFEST.in của bạn để chứa:

    recursive-exclude tests * 
    
  2. Đó là không phổ biến bao gồm README và các file khác trong thư mục site-packages, nhưng nếu bạn thực sự muốn, sau đó đi vào trong package1 và tạo biểu tượng liên kết đến các tập tin mà bạn muốn bao gồm:

    cd package1 
    ln -s ../LICENSE 
    ln -s ../README.md 
    ln -s ../RELEASE 
    

    sau đó thay đổi dòng sau trong setup.py của bạn:

    package_data = { 
        '': ['LICENSE', 'README.md', 'RELEASE'] 
    

    đến:

    package_data = { 
        'package1': ['LICENSE', 'README.md', 'RELEASE'] 
    
0

nếu cấu trúc của bạn là đúng:

  1. thư mục kiểm tra không phải là một gói phần mềm (nó không có init tập tin py), do đó find_package không loại trừ nó.
  2. include_package_data = True có nghĩa là tất cả các tệp được phiên bản sẽ được bao gồm nếu không loại trừ một cách rõ ràng.

vậy: thử một loại trừ các xét nghiệm/* trong MANIFEST.in bạn

Tôi Hy vọng nó đã giúp

+2

Tôi có __init__.py trong các bài kiểm tra, trên thực tế, chỉ không hiển thị nó trong nguồn. Trong thực tế, nếu tôi in kết quả find_packages(), nó chỉ trả về gói1. Nhưng thư mục kiểm tra vẫn được bao gồm. – 0x4B1D

16

find_packages sử dụng fnmatchcase cho loại trừ lọc của nó. Bạn có thể kiểm tra xem mô hình loại trừ của bạn phù hợp với một tên gói như sau:

>>> from fnmatch import fnmatchcase 
>>> fnmatchcase('my.package.name.tests', 'tests') 
False 

Giả sử tất cả các bài kiểm tra trong dự án của bạn sống trong tên gói kết thúc bằng tests hoặc các gói con của những gói, sau đây là đủ để loại trừ tất cả các bài kiểm tra mã:

setup(
    name='package1', 
    version='1.1', 
    packages=find_packages(exclude=['tests', '*.tests', '*.tests.*']),  
) 
+0

Đây là câu trả lời hay nhất cho câu hỏi – Greg

0

MANIFEST.in sẽ quản lý nó.

prune tests/ 
include LICENSE README.md RELEASE 

nếu bạn có các file tĩnh để được thêm vào, thêm chúng với

... 
recursive-include package1/static * 
Các vấn đề liên quan