โครงการ python จำเป็นต้องมี MANIFEST.in หรือไม่และควรมีอะไรอยู่ในนั้น?


121

คำแนะนำ "Python Distribute" (อยู่ที่ python-distribute.org แต่การลงทะเบียนนั้นสิ้นสุดลงแล้ว) บอกให้ฉันรวมdoc/txtไฟล์และ.pyไฟล์จะไม่รวมอยู่ในMANIFEST.inไฟล์

เอกสาร sourcedistบอกฉันเพียงใช้ sdist MANIFEST.inและรวมเฉพาะไฟล์ที่คุณระบุและจะรวม.pyไฟล์ นอกจากนี้ยังบอกให้ฉันใช้: python setup.py sdist --manifest-onlyเพื่อสร้าง a MANIFESTแต่ python บอกฉันว่าไม่มีอยู่จริง

ฉันขอขอบคุณสิ่งเหล่านี้มาจาก python เวอร์ชันต่างๆและระบบการแจกจ่ายก็เป็นระเบียบสมบูรณ์ แต่สมมติว่าฉันใช้ python 3 และsetuptools(อันใหม่ที่มีการแจกจ่าย แต่ตอนนี้เรียกว่า setuptools ไม่ใช่ setuptools เก่าที่เลิกใช้สำหรับการแจกจ่ายเครื่องมือเท่านั้น เพื่อนำกลับไปเผยแพร่และแจกจ่ายเปลี่ยนชื่อเป็น setuptools ..... )

และฉันทำตามโครงสร้างโฟลเดอร์และsetup.pyไฟล์'มาตรฐาน'

  1. ฉันต้องการMANIFEST.inอะไร?
  2. สิ่งที่ควรอยู่ในนั้น?
  3. ระบบและวิธีการแพ็คเกจต่างๆเหล่านี้จะถูกทำให้เป็นกระบวนการง่ายๆเพียงขั้นตอนเดียวเมื่อใด

คำตอบ:


118

Re: "ฉันต้องการ MANIFEST.in หรือไม่?

MANIFEST.inไม่มีคุณไม่จำเป็นต้องใช้ ทั้งสองอย่างdistutilsและsetuptoolsรวมอยู่ในแพ็คเกจการแจกจ่ายซอร์สไฟล์ทั้งหมดที่กล่าวถึงในsetup.py- โมดูลไฟล์แพคเกจไพ ธ อน README.txtและtest/test*.py. MANIFEST.inหากนี่เป็นสิ่งที่คุณต้องการที่จะมีการกระจายในแพคเกจที่คุณไม่จำเป็นต้องใช้

หากคุณต้องการจัดการ (เพิ่มหรือลบ) ไฟล์เริ่มต้นที่จะรวมคุณต้องใช้MANIFEST.in.

Re: อะไรควรอยู่ในนั้น?

ขั้นตอนง่าย ๆ :

  1. ตรวจสอบให้แน่ใจว่าsetup.pyคุณได้รวม (โดยใช้setupอาร์กิวเมนต์) ไฟล์ทั้งหมดที่คุณรู้สึกว่าสำคัญสำหรับโปรแกรมที่จะรัน (โมดูลแพ็คเกจสคริปต์ ... )

  2. ชี้แจงหากมีบางไฟล์ที่จะเพิ่มหรือบางไฟล์ที่จะแยกออก MANIFEST.inหากไม่จำเป็นแล้วมีความจำเป็นในการใช้ไม่มี

  3. หากMANIFEST.inจำเป็นให้สร้างขึ้นมา โดยปกติแล้วคุณเพิ่มมีtests*/*.pyไฟล์README.rstถ้าคุณไม่ได้ใช้README.txt, docsไฟล์และอาจจะเป็นบางไฟล์ข้อมูลสำหรับชุดทดสอบถ้าจำเป็น

ตัวอย่างเช่น:

include README.rst
include COPYING.txt

เพื่อทดสอบเรียกใช้python setup.py sdistและตรวจสอบ tarball dist/ที่สร้างขึ้นภายใต้

ระบบแพ็กเกจที่แตกต่างกันทั้งหมดนี้เมื่อไร ...

เปรียบเทียบสถานการณ์วันนี้กับ 2 ปีที่แล้วสถานการณ์ดีขึ้นมาก - setuptoolsเป็นหนทางที่จะไป คุณสามารถละเลยความจริงที่distutilsเป็นบิตหักและเป็นฐานในระดับต่ำสำหรับsetuptoolsเป็นsetuptoolsจะดูแลสิ่งเหล่านี้หลบซ่อนตัวจากคุณ

แก้ไข : ไม่กี่โครงการที่แล้วผมใช้pbrสำหรับการสร้างแพคเกจการจัดจำหน่ายที่มีสามสายsetup.pyและส่วนที่เหลืออยู่ในและsetup.cfg requirements.txtไม่ต้องสนMANIFEST.inและของแปลกอื่น ๆ แม้ว่าแพคเกจจะสมควรได้รับเอกสารเพิ่มเติมเล็กน้อย ดูhttp://docs.openstack.org/developer/pbr/


1
จากประสบการณ์ที่ จำกัด ของฉันดูเหมือนว่าหากคุณต้องการรวมไฟล์ที่ไม่ได้อยู่ในโมดูล python (dir กับinit .py) คุณต้องใช้ MANIFEST.in และใช้คำสั่งsdist(mean: source distribution ) หากคุณพิจารณาว่าbdistและbdist_wheelเป็นไบนารีและตั้งใจเท่านั้นที่จะติดตั้งในเส้นทางหลามของคุณนี้จะทำให้ความรู้สึก (ไฟล์และไดเร็กทอรีที่ไม่ใช่โมดูลเหล่านี้จะไปอยู่ที่ไหนใน/usr/local/lib/python2.7/dist-packages/ไม่แน่นอน) แต่มันก็คุ้มค่าที่จะกล่าวถึงเนื่องจากมันสับสนที่จะเห็นไฟล์เก็บถาวรที่สร้างขึ้นและไฟล์เหล่านั้นไม่รวมไฟล์
Bruno Bronosky

7
เพื่อหลีกเลี่ยงไม่ให้คำแนะนำpackage_dataและdata_filesคำแนะนำซึ่งอยู่นอกขอบเขตฉันจะดำเนินการต่อ package_dataแสดงรายการไฟล์ที่ติดตั้งพร้อมกับแพ็คเกจของคุณdist-packages/yourpackageซึ่งอาจถูกข้ามไปเนื่องจากไม่มีชื่อ * .py data_filesแสดงรายการไฟล์ที่ติดตั้งนอกแพ็กเกจของคุณ แต่ละรายการระบุพา ธ เป้าหมายที่ขึ้นต้นด้วยsys.prefixหากเป็นแบบสัมพันธ์หรือสร้างขึ้นโดยตรง (การอนุญาตการอนุญาต) หากเริ่มต้นด้วย a /.
Bruno Bronosky

2
@JanVlcinsky สิ่งสำคัญคือต้องรู้ว่าอะไรคืออะไรและ [ที่สำคัญกว่า] จะไม่รวมอยู่ในรูปแบบการแจกจ่ายที่แตกต่างกัน ฉันมีโครงการสาธารณะที่ฉันแจกจ่ายผ่านการแจกจ่ายต้นทางเท่านั้นเนื่องจากฉันมีไฟล์ boto.sample.cfg (ซึ่งมีข้อมูลรับรอง AWS IAM ปลอม) นอกแพ็กเกจ (ที่รูท) และการแจกแจงไบนารีจะไม่รวมไว้ด้วย ฉันสร้างไบนารีส่วนตัวสำหรับการปรับใช้กับการผลิตที่มี data_files = [('/ etc /', ['boto.cfg'])] หากคุณต้องการแจกจ่ายไฟล์ที่ไม่ใช่ py คุณต้องรู้ว่าสิ่งเหล่านี้ทำงานอย่างไร
Bruno Bronosky

2
@MichaelGoerz สุจริตพวกเขาไม่ควร คำตอบนี้เป็นคำตอบโบราณและการแนะนำpbrก็เป็นความคิดที่ไม่ดีเช่นกัน
Arne

1
@ ฉันเห็นด้วยสิ่งต่าง ๆ ดำเนินต่อไป ขณะนี้ฉันกำลังแปลงโครงการส่วนใหญ่จาก pbr เป็นกวีนิพนธ์
ม.ค. Vlcinsky

7

คำถามเก่าคำตอบใหม่:

MANIFEST.inไม่มีคุณไม่จำเป็นต้อง อย่างไรก็ตามในsetuptoolsการทำสิ่งที่คุณ (โดยปกติ) หมายถึงคุณจะต้องใช้สิ่งsetuptools_scmที่มีบทบาทMANIFEST.inใน 2 สถานที่สำคัญ:

  • ช่วยให้มั่นใจได้ว่าไฟล์ที่เกี่ยวข้องทั้งหมดได้รับการจัดแพ็กเกจเมื่อรันsdistคำสั่ง (โดยที่ไฟล์ที่เกี่ยวข้องทั้งหมดถูกกำหนดเป็น "ไฟล์ทั้งหมดภายใต้การควบคุมแหล่งที่มา")
  • เมื่อใช้include_package_dataเพื่อรวมข้อมูลแพ็คเกจเป็นส่วนหนึ่งของbuildหรือbdist_wheel. (อีกครั้ง: ไฟล์ภายใต้การควบคุมแหล่งที่มา)

ความเข้าใจในอดีตMANIFEST.inคือเมื่อคุณไม่มีระบบควบคุมแหล่งที่มาคุณต้องมีกลไกอื่นเพื่อแยกความแตกต่างระหว่าง "ไฟล์ต้นฉบับ" และ "ไฟล์ที่อยู่ในไดเรกทอรีการทำงานของคุณ" อย่างไรก็ตามโครงการของคุณอยู่ภายใต้การควบคุมแหล่งที่มา (ขวา ??) MANIFEST.inจึงไม่มีความจำเป็นในการ ข้อมูลเพิ่มเติมในบทความนี้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.