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

लेकिन सेटप्टूल के अनुरक्षक के अनुसार , एक घोषणात्मक बिल्ड कॉन्फ़िगरेशन आदर्श है और एक अनिवार्य बिल्ड का उपयोग करना एक कोड गंध होने वाला है। इसलिए हम इसके 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 फ़ाइल का निर्माण करना चाहिए ? Sdist बनाने के लिए उपयोगकर्ता का सामना करने वाला उपकरण क्या है? मैं बिल्ड बैकेंड को बदलना नहीं चाहता। ऐसा लगता है कि अन्य पैकेजिंग उपकरण सभी अपने स्वयं के बिल्ड एंट्री पॉइंट लिखते हैं, लेकिन मुझे लगा कि मेटाडेटा में डिक्लेरेटिव बिल्ड सिस्टम को परिभाषित करने का पूरा बिंदु ऐसा था कि आपको बिल्ड सिस्टम के साथ हाथ नहीं मिलाना था, यह सीखना कि प्रत्येक कैसे अलग-अलग पैकेजिंग टूल से यह पूछा जाता है कि वह दुभाषिया में जाए या मैन्युअल रूप से पायथन एपीआई को कॉल करे। लेकिन सिस्टम की आवश्यकताओं के लिए PEP अब 2 साल से अधिक पुराना है। क्या में यहां कुछ भूल रहा हूँ?

setup.pyफ़ाइल का उपयोग किए बिना स्रोत वितरण का निर्माण कैसे करें ?

जवाबों:


10

यह कुछ हद तक विवादास्पद विषय है, और पल के लिए जवाब है कि कोई भी एक उपकरण नहीं है जो सभी को सहमत करता है कि स्रोत वितरण बनाने के लिए "सही तरीका" है, न ही वह उपकरण क्या होगा। आप पायथन पैकेजिंग प्रवचन पर इसके बारे में एक लंबा सूत्र देख सकते हैं ।

मैं टिकाऊ स्वरूपों में बहुत ज्यादा पैकेजिंग सलाह देने के लिए क्योंकि रेत हमेशा जा रहे हैं संकोच, लेकिन नवंबर 2019 के रूप में, setup.py sdistहै नहीं पदावनत है, लेकिन यह करता है कि पीईपी 517 और पीईपी 518 फिक्स करने का इरादा किए गए सभी कमियां है - है अर्थात् है कि आप स्वयं बिल्ड वातावरण बनाने के लिए (और सभी बिल्ड निर्भरता के बारे में जानते हैं), और यह केवल सेटप्टूल / डिस्टिल और उनके समकक्षों के साथ काम करता है।

यह एक "आधिकारिक" सिफारिश, लेकिन के लिए मौजूदा सबसे अच्छा प्रतिस्थापन नहीं है setup.py sdistऔर setup.py bdist_wheelके कमांड लाइन संस्करण लागू है pep517। इसके लिए प्रतिस्थापन sdistहै:

python -m pep517.build --source .

आप पहिया और स्रोत वितरण का निर्माण उसी समय कर सकते हैं जैसे:

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

यह है कि मैं अपने PEP 517- संगत पैकेज कैसे बनाता हूं।

इसके लिए यह आवश्यक है कि आपके प्रोजेक्ट में a pyproject.toml, और pyproject.tomlmust build-system.requiresऔर build-system.build-backendkeys हों, लेकिन यह PEP 517- संगत बैकएंड (सहित flit) के साथ किसी भी प्रोजेक्ट के लिए काम करेगा ।

अन्य उपकरण :

का उपयोग नहीं क्यों flitया poetryया hatch? वे उपकरण उन सभी के लिए उपलब्ध हैं जो उनका उपयोग करना चाहते हैं, लेकिन वे इस प्रश्न का उत्तर नहीं हैं । यह प्रश्न setuptoolsघोषणात्मक setup.cfgप्रारूप का उपयोग करने वाली परियोजनाओं के निर्माण के बारे में पूछ रहा है । न तो flitहै और न ही poetryसामान्य पीईपी 517 निर्माण सामने समाप्त होता है के रूप में कार्य, और इसलिए वे केवल परियोजनाओं के लिए निर्माण आदेशों के रूप में काम करते हैं उनके संबंधित बैकेंड का उपयोग कर।

मैं hatchयह कहने के लिए पर्याप्त रूप से परिचित नहीं हूं कि यह सेटपूलों के अलावा अन्य बैकएंड वाली परियोजनाओं का प्रबंधन कर सकता है या नहीं , लेकिन (फिर से, नवंबर 2019 तक), यह पीईपी 517 नहीं है, और यह काम नहीं करेगा यदि आपके पास नहीं है a setup.py(यह "सेटअप फ़ाइल को खोल नहीं सकता" त्रुटि को बढ़ाएगा ", और यह आपकी pyproject.tomlफ़ाइल को अनदेखा कर देगा )।


क्यों ध्यान केंद्रित किया जाता है, pep517.buildजो केवल एक प्रयोग के रूप में होता है, एक अस्थायी बैसाखी जब उत्पादक उपकरण होते हैं जैसे कि फ्लिट, कविता, हैच, और शायद और भी?
सिनोरोक

1
क्योंकि यह मेरे अनुमान में एक सफल प्रयोग था (मैं और कई अन्य PyPA लोग इसका उपयोग करते हैं), क्योंकि इसमें नौकरी के लिए सही शब्दार्थ है, और क्योंकि यह एकमात्र सामान्य-उद्देश्य PEP 517 बिल्ड फ्रंट-एंड है जो मुझे पता है। फ्लिट और कविता खड़ी रूप से एकीकृत हैं, जिसमें वे उम्मीद करते हैं कि आप उनके बैकएंड का उपयोग करेंगे। हैच कई अन्य चीजें करता दिखाई देता है। pep517.buildइस उद्देश्य के लिए बनाया गया एक सरल उपकरण है।
पॉल

आह ठीक है, अच्छी बात है। मैं बिल्ड बैक-एंड पर ध्यान केंद्रित कर रहा था। और मैं वास्तव में सोचा pep517.buildथा कि उनमें से एक था। लेकिन बिल्कुल नहीं, यह वास्तव में एक बिल्ड फ्रंट-एंड है। इसके अलावा पक्षियों के बच्चे PEP517 तैयार के रूप में मैं अब दिखाई नहीं दे रहा है।
सिनोरोक

1
मैंने आपके प्रश्न का उत्तर देने के लिए अपना उत्तर अपडेट कर दिया है।
पॉल

हां बढ़िया। मैं अपना उत्तर हटा देता हूं।
सिनोरोक

-1

पायथन पैकेजिंग की बात आती है तो "स्पष्ट" कुछ भी नहीं है। वास्तव में, कुछ समय के लिए, यदि आप डिस्टुटिल्स / सेटप्टूल का उपयोग कर रहे हैं, तो एक (लगभग) खाली 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 जैसे माध्यम से सक्षम हैं ।


यकीन नहीं हो रहा है कि यह क्यों ठुकराया जा रहा है; यह मूल रूप से सही है भले ही अन्य समाधान हों।
इगुआनाउनट

2
सवाल का शीर्षक है "कैसे सेटअप थ्रू फ़ाइल का उपयोग किए बिना स्रोत वितरण का निर्माण किया जाए ?" यह उत्तर बस "यहां बताया गया है कि एक ही setup.py फ़ाइल जिसे आपने अभी-अभी हटा दिया है" को कैसे बनाया जाए, यह प्रदर्शित करने के लिए लगता है, जो उपयोगी नहीं है।
प्लैटिपस

हां, लेकिन यह गलतफहमी पर आधारित था कि एक घोषणा पत्र लिखने का setup.cfgमतलब है कि setup.pyसेटपूल का उपयोग करना अब जरूरी नहीं है, जो सच नहीं है। सिर्फ इसलिए कि प्रश्न का शीर्षक भ्रामक है इसका मतलब यह नहीं है कि उत्तर है। उन्होंने सवाल के शरीर में लिखा है "तो आपको वास्तव में सेटटूलूल का उपयोग करके .tar.gz फ़ाइल का निर्माण कैसे करना चाहिए ?" जिसका यह सही उत्तर देता है।
नौगवांनुत

1
यह वास्तव में सच है। अगर आप PEP 517 का उपयोग कर रहे हैं, तो setuptools को सेटअप
पॉल

"यदि आप पीईपी 517 का उपयोग कर रहे हैं" तो अधिकांश लोगों को छोड़कर नहीं। यह अभी भी अस्थायी है, और मुश्किल से भी में बताया गया है packaging.python.org । यह कुछ ऐसा नहीं है जब तक आप इसके लिए खोज करना नहीं जानते। यदि आप बस सेटपूलों को काम करना चाहते हैं, क्योंकि यह हमेशा उपयोग किया जाता है तो यह सही है।
१२:३२ पर इगुआनाटुत
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.