วิธีสร้างการกระจายแหล่งที่มาโดยไม่ใช้ไฟล์ setup.py


10

ด้วยโครงสร้างแพ็คเกจดังต่อไปนี้

.
├── my_package
   └── __init__.py
├── setup.cfg
└── setup.py

เนื้อหาของ setup.py

from setuptools import setup
setup()

เนื้อหาของ setup.cfg

[metadata]
name = my_package
version = 0.1

[options]
packages = find:

ฉันสามารถสร้างวงล้อหรือแหล่งแจกจ่ายmy_packageแบบนี้

pip wheel --no-deps -w dist .
# generates file ./dist/my_package-0.1-py3-none-any.whl
python setup.py sdist
# generates file ./dist/my_package-0.1.tar.gz

แต่ตามผู้ดูแลของ setuptoolsการกำหนดค่าการสร้างที่เปิดเผยนั้นเหมาะและการใช้งานที่จำเป็นจะเป็นกลิ่นรหัส ดังนั้นเราจึงแทนที่setup.pyด้วยpyproject.toml:

.
├── my_package
   └── __init__.py
├── setup.cfg
└── pyproject.toml

เนื้อหาของ pyproject.toml

[build-system]
build-backend = "setuptools.build_meta"
requires = ["setuptools", "wheel"]

และคุณยังสามารถสร้างวงล้อได้เช่นเดียวกับเมื่อก่อนมันใช้งานได้ แต่ sdist ไม่ทำงาน:

python: can't open file 'setup.py': [Errno 2] No such file or directory

ดังนั้นคุณควรสร้างไฟล์. tar.gz โดยใช้ setuptoolsอย่างไร เครื่องมือที่ผู้ใช้สร้างขึ้นเพื่อสร้าง sdist คืออะไร ฉันไม่ต้องการเปลี่ยนการสร้างแบ็กเอนด์ ดูเหมือนว่าเครื่องมือบรรจุภัณฑ์อื่น ๆ ทั้งหมดเขียนจุดเริ่มต้นการสร้างของตัวเอง แต่ฉันคิดว่าจุดทั้งหมดของการกำหนดระบบการสร้างที่ประกาศในเมตาดาต้าคือเพื่อให้คุณไม่ต้องทำมือกับระบบการสร้าง เครื่องมือบรรจุภัณฑ์ที่แตกต่างกันคาดว่าจะถูกเรียกใช้หรือต้องเข้าไปในล่ามและเรียก Python API ด้วยตนเอง แต่ PEP สำหรับการสร้างความต้องการของระบบนั้นมีอายุมากกว่า 2 ปีแล้ว ฉันขาดอะไรบางอย่างชัดเจนที่นี่?

วิธีสร้างการกระจายแหล่งที่มาโดยไม่ใช้setup.pyไฟล์

คำตอบ:


10

นี่เป็นหัวข้อที่ถกเถียงกันอยู่และคำตอบสำหรับช่วงเวลานั้นคือไม่มีเครื่องมือเดียวที่ทุกคนเห็นพ้องต้องกันว่าเป็น "วิธีที่ถูกต้อง" ในการสร้างการแจกแจงแหล่งที่มา ท่านสามารถเข้าดูด้ายยาวเกี่ยวกับเรื่องวาทกรรมบรรจุภัณฑ์หลาม

ผมลังเลที่จะให้คำแนะนำในการบรรจุภัณฑ์ที่มากเกินไปในรูปแบบที่มีความทนทานเพราะหาดทรายมักจะขยับ แต่เป็นของเดือนพฤศจิกายน 2019 setup.py sdistจะไม่เลิก แต่ก็ไม่ได้มีข้อเสียทั้งหมดที่ PEP 517 และ PEP 518 มีวัตถุประสงค์เพื่อแก้ไข - คือว่าคุณมี เพื่อสร้างสภาพแวดล้อมการสร้างด้วยตัวเอง (และรู้เกี่ยวกับการสร้างการอ้างอิงทั้งหมด) และใช้งานได้เฉพาะกับ setuptools / distutils และสิ่งที่เทียบเท่า

มันไม่ได้เป็น "ข้าราชการ" คำแนะนำ แต่เปลี่ยนที่ดีที่สุดในปัจจุบันsetup.py sdistและมีการกล่าวอ้างรุ่นบรรทัดคำสั่งของsetup.py bdist_wheel pep517การทดแทนsdistคือ:

python -m pep517.build --source .

คุณสามารถสร้างวงล้อและการกระจายแหล่งที่มาในเวลาเดียวกันโดย:

python -m pep517.build --source --binary .

นี่คือวิธีที่ฉันสร้างแพ็คเกจที่เข้ากันได้กับ PEP 517 ของฉัน

สิ่งนี้ต้องการให้โครงการของคุณมีpyproject.tomlและและpyproject.tomlต้องมีbuild-system.requiresและbuild-system.build-backendกุญแจ แต่จะใช้ได้กับโครงการที่มีแบ็กเอนด์ที่รองรับ PEP 517 (รวมถึงflit)

เครื่องมืออื่น ๆ :

ทำไมไม่ใช้flitหรือpoetryหรือhatch? เครื่องมือเหล่านั้นพร้อมใช้งานสำหรับผู้ที่ต้องการใช้ แต่ไม่ได้รับคำตอบสำหรับคำถามนี้ คำถามนี้ถามเกี่ยวกับโครงการที่สร้างโดยsetuptoolsใช้setup.cfgรูปแบบการประกาศ ทั้งflitมิได้poetryทำหน้าที่เป็น PEP ทั่วไป 517 สร้างปลายด้านหน้าและเพื่อพวกเขาเพียง แต่ทำงานเป็นสร้างคำสั่งสำหรับโครงการที่ใช้แบ็กเอนด์ของตน

ผมพอที่จะไม่คุ้นเคยกับการhatchที่จะพูดหรือไม่ก็สามารถจัดการโครงการที่มีแบ็กเอนด์อื่น ๆกว่า setuptools แต่ (อีกครั้ง ณ พฤศจิกายน 2019) มันเป็นไม่ได้กำลังใจ 517 หน้าและมันจะไม่ทำงานหากคุณไม่ได้มีsetup.py(มันจะยกข้อผิดพลาด "ไม่สามารถเปิดไฟล์ setup.py" และมันจะไม่ใช้ของคุณpyproject.tomlไฟล์)


เหตุใดจึงมุ่งเน้นpep517.buildเฉพาะการทดลองซึ่งเป็นไม้ยันรักแร้ชั่วคราวเมื่อมีเครื่องมือที่ใช้ในการผลิตเช่น flit, poetry, hatch และอาจจะมากกว่านี้?
sinoroc

1
เนื่องจากเป็นการทดลองที่ประสบความสำเร็จในการประมาณค่าของฉัน (ฉันและคนอื่น ๆ ใช้ PyPA) เนื่องจากมีความหมายที่เหมาะสมสำหรับงานและเพราะมันเป็น PEP 517 ที่ใช้งานทั่วไปเพียงอย่างเดียวที่ฉันรู้จัก flit และกวีนิพนธ์ถูกรวมเข้าด้วยกันในแนวตั้งซึ่งพวกเขาคาดหวังให้คุณใช้แบ็กเอนด์ ฟักดูเหมือนจะทำสิ่งอื่น ๆ อีกมากมาย pep517.buildเป็นเครื่องมือง่ายๆที่สร้างขึ้นเพื่อจุดประสงค์นี้
พอล

ใช่แล้วจุดดี ฉันมุ่งเน้นไปที่การสร้างแบ็คเอนด์ และฉันก็คิดว่าpep517.buildเป็นหนึ่งในนั้น แต่ไม่ใช่ทั้งหมดมันเป็นงานสร้างส่วนหน้า ฟักยังไม่พร้อม PEP517 อย่างที่ฉันเห็นตอนนี้
sinoroc

1
ฉันได้อัปเดตคำตอบเพื่อตอบคำถามของคุณแล้ว
พอล

ใช่แล้วสมบูรณ์แบบ ฉันลบคำตอบของฉัน
sinoroc

-1

ไม่มีอะไร "ชัดเจน" เมื่อมันมาถึงบรรจุภัณฑ์ Python อันที่จริงแล้วในขณะนี้อย่างน้อยถ้าคุณใช้ distutils / setuptools คุณจำเป็นต้องสร้างsetup.pyไฟล์เปล่า (เกือบ) แม้ว่าคุณจะใช้การประกาศอย่างสมบูรณ์setup.cfg:

#!/usr/bin/env python
from setuptools import setup
setup()

chmod +x setup.pyผมขอแนะนำ

ในกรณีนี้คุณเพียงแค่เขียน "จุดเริ่มต้น" ไปยังระบบการสร้างด้วยตัวเองและsetup()เป็นเพียงmain()ฟังก์ชั่นสำหรับมัน - แต่ตอนนี้ทุกข้อโต้แย้งที่ผ่านมาแบบดั้งเดิมsetup()สามารถอ่านได้จากsetup.cfgแทน

ตอนนี้คุณยังสามารถใช้งานได้setup.py sdistหากคุณต้องการสร้างแหล่งทาร์บอล:

./setup.py sdist

นอกจากนี้คุณยังสามารถลองหนึ่งในทางเลือกที่สร้างระบบที่มีการใช้งานผ่านทางpyproject.tomlเช่นโผ


ไม่แน่ใจว่าทำไมสิ่งนี้ถึงถูกลดระดับลง มันถูกต้องโดยทั่วไปแม้ว่าจะมีวิธีแก้ไขปัญหาอื่น ๆ
Iguananaut

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

ใช่ แต่นั่นก็ขึ้นอยู่กับความเข้าใจผิดว่าการเขียนsetup.cfgหมายถึงการประกาศว่าsetup.pyไม่จำเป็นต้องใช้ setuptools อีกต่อไปซึ่งไม่เป็นความจริง เพียงเพราะชื่อของคำถามที่ทำให้เข้าใจผิดไม่ได้หมายความว่าคำตอบคือ พวกเขาเขียนในเนื้อความของคำถาม "แล้วคุณจะสร้างไฟล์. tar.gz ได้อย่างไรโดยใช้ setuptools ?" ซึ่งคำตอบนี้ถูกต้อง
Iguananaut

1
มันเป็นเรื่องจริง setuptools ไม่ต้องการไฟล์ setup.py หากคุณใช้ PEP 517
Paul

"ถ้าคุณใช้ PEP 517" ยกเว้นว่าคนส่วนใหญ่ไม่ใช่ ก็ยังคงชั่วคราวและแทบจะไม่กล่าวถึงแม้จะอยู่ในpackaging.python.org ไม่ใช่สิ่งที่คุณจะมีนอกเสียจากว่าคุณจะมองหามัน หากคุณเพียงแค่ต้องการให้ setuptools ทำงานตามปกติมันก็จะถูกต้อง
Iguananaut
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.