Các dự án python có cần MANIFEST.in không và những gì nên có trong đó?


120

Hướng dẫn "Phân phối Python" (có tại python-distribute.org, nhưng đăng ký đó đã hết hiệu lực) cho tôi biết bao gồm doc/txttệp và .pytệp bị loại trừ trong MANIFEST.intệp

Các tài liệu sourcedist nói với tôi chỉ sử dụng sdist MANIFEST.invà chỉ bao gồm các tập tin bạn chỉ định và bao gồm .pycác file. Nó cũng yêu cầu tôi sử dụng: python setup.py sdist --manifest-onlyđể tạo một MANIFEST, nhưng python cho tôi biết điều này không tồn tại

Tôi đánh giá cao những điều này là từ các phiên bản khác nhau của python và hệ thống phân phối đang ở trong tình trạng hỗn độn hoàn toàn, nhưng giả sử tôi đang sử dụng python 3 và setuptools(phiên bản mới bao gồm phân phối nhưng hiện được gọi là setuptools, không phải là setuptools cũ không được dùng chỉ cho các công cụ phân phối được đưa trở lại phân phối và phân phối được đổi tên thành setuptools .....)

và tôi đang tuân theo cấu trúc thư mục và setup.pytệp 'chuẩn' ,

  1. Tôi có cần một MANIFEST.in?
  2. Những gì nên được trong đó?
  3. Khi nào thì tất cả các hệ thống và phương pháp gói khác nhau này được tạo thành một quy trình đơn giản?

Câu trả lời:


117

Re: "Tôi có cần MANIFEST.in không?

Không, bạn không cần phải sử dụng MANIFEST.in. Cả hai distutilssetuptoolsđều bao gồm trong gói phân phối nguồn tất cả các tệp được đề cập trong setup.py- mô-đun, gói tệp python README.txttest/test*.py. Nếu đây là tất cả những gì bạn muốn có trong gói phân phối, bạn không cần phải sử dụng MANIFEST.in.

Nếu bạn muốn thao tác (thêm hoặc bớt) các tệp mặc định để đưa vào, bạn phải sử dụng MANIFEST.in.

Re: Những gì nên được trong đó?

Thủ tục rất đơn giản:

  1. Đảm bảo rằng trong setup.pybạn bao gồm (bằng các setupđối số) tất cả các tệp mà bạn cảm thấy quan trọng để chương trình chạy (mô-đun, gói, tập lệnh ...)

  2. Làm rõ, nếu có một số tệp cần thêm hoặc một số tệp cần loại trừ. Nếu không cần thiết, thì không cần sử dụng MANIFEST.in.

  3. Nếu MANIFEST.incần, hãy tạo nó. Thông thường, bạn thêm vào đó tests*/*.pycác tệp, README.rstnếu bạn không sử dụng README.txt, docscác tệp và có thể một số tệp dữ liệu cho bộ thử nghiệm, nếu cần.

Ví dụ:

include README.rst
include COPYING.txt

Để kiểm tra nó, hãy chạy python setup.py sdistvà kiểm tra tarball được tạo bên dưới dist/.

Khi nào thì tất cả các hệ thống gói khác nhau này ...

So sánh tình hình hiện nay và 2 năm trước - tình hình tốt hơn nhiều - setuptoolslà cách để đi. Bạn có thể bỏ qua thực tế, distutilscó một chút hỏng hóc và là cơ sở cấp thấp setuptoolssetuptoolssẽ lo giấu những điều này với bạn.

CHỈNH SỬA : Một vài dự án cuối cùng tôi sử dụng pbrđể xây dựng các gói phân phối với ba dòng setup.pyvà phần còn lại là setup.cfgrequirements.txt. Không cần quan tâm đến MANIFEST.invà những thứ kỳ lạ khác. Mặc dù gói sẽ xứng đáng có nhiều tài liệu hơn một chút. Xem http://docs.openstack.org/developer/pbr/


1
Theo kinh nghiệm hạn chế của tôi, có vẻ như nếu bạn muốn bao gồm các tệp không bên trong mô-đun python (dir với init .py), bạn phải sử dụng MANIFEST.in và sử dụng lệnh sdist(có nghĩa là: phân phối nguồn ). Nếu bạn xem xét rằng bdistbdist_wheelnhị phân và chỉ nhằm mục đích được cài đặt trong đường dẫn python của bạn, điều này có ý nghĩa. (Các tệp và thư mục không phải mô-đun này sẽ đi đâu? Trong /usr/local/lib/python2.7/dist-packages/? Chắc chắn là không.) Nhưng điều đáng nói là vì thật khó hiểu khi thấy tệp lưu trữ được tạo và chúng không bao gồm tệp.
Bruno Bronosky

7
Để bắt đầu những điều không thể tránh khỏi package_datavà các data_fileskhuyến nghị nằm ngoài phạm vi, tôi sẽ tiếp tục. package_dataliệt kê tệp được cài đặt với gói của bạn dist-packages/yourpackagemà có thể đã bị bỏ qua vì tệp này không có tên * .py. data_filesliệt kê các tệp được cài đặt bên ngoài gói của bạn. Mỗi mục nhập chỉ định một đường dẫn đích được bắt đầu bằng sys.prefixnếu nó là tương đối hoặc được tạo trực tiếp (quyền cho phép) nếu nó bắt đầu bằng a /.
Bruno Bronosky

2
@JanVlcinsky điều quan trọng là phải biết những gì là và [quan trọng hơn] không được bao gồm trong các định dạng phân phối khác nhau. Tôi có một dự án công khai mà tôi chỉ phân phối qua phân phối nguồn vì tôi bao gồm tệp boto.sample.cfg (chứa thông tin đăng nhập AWS IAM giả mạo) bên ngoài gói (ở gốc) và các bản phân phối nhị phân sẽ không bao gồm tệp đó. Tôi tạo các bản dựng nhị phân riêng để triển khai cho sản xuất có data_files = [('/ etc /', ['boto.cfg'])]. Nếu bạn muốn phân phối các tệp không phải py, bạn phải biết những thứ này hoạt động như thế nào.
Bruno Bronosky

2
@MichaelGoerz Thành thật mà nói, họ không nên. Câu trả lời này là cổ xưa, và gợi ý pbrcũng là một ý kiến ​​tồi.
Arne

1
@Ame Tôi đồng ý, mọi thứ vẫn tiếp tục. Hiện nay tôi đang chuyển đổi hầu hết các dự án của tôi từ PBR để thơ
Jan Vlcinsky

7

Câu hỏi cũ, câu trả lời mới:

Không, bạn không cần MANIFEST.in. Tuy nhiên, để setuptoolslàm được những gì bạn (thường) muốn nói, bạn cần phải sử dụng setuptools_scm, có vai trò MANIFEST.inở 2 vị trí chính:

  • Nó đảm bảo tất cả các tệp có liên quan được đóng gói khi chạy sdistlệnh (trong đó tất cả các tệp có liên quan được định nghĩa là "tất cả các tệp dưới sự kiểm soát nguồn")
  • Khi sử dụng include_package_datađể bao gồm dữ liệu gói như một phần của buildhoặc bdist_wheel. (một lần nữa: các tệp được kiểm soát nguồn)

Cách hiểu lịch sử MANIFEST.inlà: khi bạn không có hệ thống kiểm soát nguồn, bạn cần một số cơ chế khác để phân biệt giữa "tệp nguồn" và "tệp tình cờ có trong thư mục làm việc của bạn". Tuy nhiên, dự án của bạn đang được kiểm soát nguồn (phải không ??) nên không cần MANIFEST.in. Thông tin thêm trong bài viết này .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.