2010-11-01 35 views
5

पर कस्टम पैकेज का उपयोग कर मैं अभी कुछ पाइथन में कुछ परियोजनाएं कर रहा हूं, और मैं यह पता लगाने की कोशिश कर रहा हूं कि मौजूदा ओपन सोर्स पैकेज के अपने संस्करणों के साथ कैसे काम करना है।मेरी पायथन परियोजना

उदाहरण के लिए, मैं zc.buildout के साथ tipfy का उपयोग कर रहा हूं, और मैंने 'पेपैल' पैकेज में जोड़ा है। दुर्भाग्यवश इसमें मेरी कोई सुविधा नहीं है, इसलिए मैंने इसे जिथब पर फोर्क किया है और सुविधा को जोड़ा है। मैं मूल पैकेज रखरखाव को एक पुल अनुरोध भेजूंगा, लेकिन क्या वे मेरे जोड़ों को स्वीकार करते हैं या नहीं, मैं पैकेज के अपने संस्करण का उपयोग करना चाहता हूं और zc.buildout को मेरी निर्भरताओं का प्रबंधन करने की सुविधा रखना चाहता हूं। मैं यह कैसे करु?

क्या मैं लाइब्रेरी पर लाइफ पर अपना खुद का लेआउट अपलोड करता हूं और इसे अपने नाम से उपसर्ग करता हूं? क्या वह अनावश्यक रूप से सूचकांक को प्रदूषित नहीं करेगा?

या मुझे अपनी खुद की अनुक्रमणिका और पैकेज रेपो बनाना और बनाए रखना चाहिए? मुझे इसके लिए प्रारूप कहां मिल सकता है? और क्या यह ओएसएसएस लाइसेंसों के संदर्भ में संशोधित पैकेजों के साथ एक ही नाम के साथ अपने खुद के रेपो होस्ट करने के लिए है? (मैं नए नामस्थानों के साथ प्रोजेक्ट में प्रत्येक फ़ाइल को संशोधित नहीं करना चाहूंगा)

मुझे यकीन है कि यह समस्या काफी ऊपर आती है, न केवल पाइथन के साथ। मैं इसे मैवेन और एसबीटी के साथ भी देख सकता हूं ... जब लोग लोकप्रिय पैकेजों के अपने संस्करणों का उपयोग करना चाहते हैं तो आम तौर पर लोग क्या करते हैं?

उत्तर

5

इस बारे में आप दो तरीकों से जा सकते हैं। मैं दोनों का उपयोग करें, संदर्भ buildout के लिए इस्तेमाल किया जा रहा है पर निर्भर करता है:

  1. उपयोग mr.developer (mr.developer सिस्टम की एक विस्तृत श्रृंखला, Git सहित समर्थन) एक संस्करण नियंत्रण प्रणाली से संकुल शामिल करने के लिए। विकास करते समय मैं इसका इस्तेमाल करता हूं।

  2. एक निजी पैकेज भंडार बनाएँ। अपाचे में एक साधारण निर्देशिका सूची पर्याप्त है। एक find-links प्रविष्टि के रूप में अपने निजी भंडार के लिए URL जोड़ें: इस उदाहरण में

    [buildout] 
    ... 
    find-links = 
        ... 
        http://username:[email protected]/projectname 
    

    मैं भी एक उपयोगकर्ता नाम और पासवर्ड (buildout तो प्रमाणित जाएगा) और सर्वर पर एक रास्ता है कि परियोजना विशिष्ट है शामिल थे। आप निश्चित रूप से अपनी सभी परियोजनाओं के लिए एक बड़ा निजी भंडार भी बना सकते हैं।

    उस भंडार में आप या तो पूरे अंडे, या केवल पैकेज की एक टैरबॉल डालते हैं। find-links में नामित रेपॉजिटरीज़ पीपीपीआई से पहले खोजे जाते हैं।

    मैं तैनाती के निर्माण के लिए इस विधि का उपयोग करता हूं। इस तरह सॉफ्टवेयर रिलीज पैकेज का उपयोग करेगा, जो रिलीज प्रबंधन को अधिक स्पष्ट और सरल बनाता है।

ओएसएस पैकेज के अपने स्वयं के कांटे को होस्ट करना बिल्कुल ठीक है! यह ओएसएस का उपयोग करते समय आपको प्राप्त होने वाली स्वतंत्रताओं में से एक है। ध्यान दें कि जब आप इस तरह के जीपीएल कोड को फोर्क करते हैं, और इसे किसी तीसरे पक्ष को वितरित कर रहे हैं, तो आपको अपने बदलावों को उनके लिए उपलब्ध कराने की आवश्यकता है। एक पैकेज भंडार इस के साथ अनुपालन करने का एक तरीका है।

+0

धन्यवाद ... इसके साथ जाऊंगा। मैं कई परियोजनाओं पर डीपी बनाए रखने के लिए यह वास्तव में उपयोगी तरीका है। –

+0

बिल्डआउट कॉन्फ़िगरेशन में उपयोगकर्ता नाम और पासवर्ड होना अच्छा नहीं है। इन्हें .pypirc में रखना बेहतर है: https://stackoverflow.com/questions/37323392/how-to-safely-basic-auth-to-private-pypi-with-zc-buildout – Petri

0

आपके प्रोजेक्ट के setup.py में dependency_links में डाले गए किसी भी पथ को पहले खोजा जाएगा। तो बस अपने पैकेज को पथ में छोड़ दें और उस पथ पर dependency_links सेट करें।

local_packages = ['file:///path/to/packages'] 

setup(
... 
dependency_links=local_packages, 
...) 

Setuptool डॉक्स कि यह सब कैसे काम करता है, लेकिन वह वास्तव इसके लिए बस इतना है पर थोड़ा और अधिक को कवर किया।

संपादित करें: zc.buildout डिफ़ॉल्ट रूप से setuptools dependency_links var का उपयोग करता है। If you want to turn it off

+0

यह कोशिश करेगा .. और फ़ोल्डर में क्या होना चाहिए 'sdist' से tar.gz है, है ना? –

+0

बिल्डआउट इसे प्रबंधित करने के लिए कहीं बेहतर विकल्प प्रदान करता है। वितरण विन्यास के साथ अपने पायथन पैकेज को विनियमित करने की कोई ज़रूरत नहीं है! –

+0

मुझे लगता है कि बिल्डआउट सिर्फ इस मशीनरी को नकल करने के बजाय मास्किंग कर रहा है। खोज-लिंक का उपयोग करने का आपका जवाब बहुत समान लगता है। इसके अलावा, मुझे वितरण विन्यास के साथ कुछ भी गलत नहीं लगता है। प्रत्येक pypi पैकेज में एक है। – dcolish

2

अपने सिरदर्द को चेक में रखने के लिए, मैं वास्तव में आपके पैकेज के साथ इस तरह के सभी कस्टम कोड को बंडल करने की अनुशंसा करता हूं। मान लें कि आपने कुछ package का कांटा बनाया है। जब तक इसका लाइसेंस इसकी अनुमति देता है, तब तक मैं अपने कोड के साथ package के संशोधित संस्करण को बंडल कर दूंगा, जैसे कि यह सिर्फ एक और निर्देशिका है। आप इसे स्थानीय स्तर पर package के तहत रख सकते हैं ताकि इसे आसानी से मिल सके। एक बार package के डेवलपर जो आपको चाहिए उसे ठीक करें, बस इस निर्देशिका को हटा दें और इसे एक बार फिर ऑनलाइन पैकेज पर निर्भरता बनाएं।

इस दृष्टिकोण का एक अतिरिक्त बोनस उपयोगकर्ताओं/ग्राहकों को वितरण को आसान बना रहा है।

+0

मैं कई परियोजनाओं में 'पैकेज' का उपयोग करने जा रहा हूं ... वास्तव में इसकी कई प्रतियां बनाए रखना नहीं चाहते हैं, खासकर जब मैं इसे निर्भरता के रूप में हल कर सकता हूं। –

1

यह कुछ समय हो गया है क्योंकि मैंने बिल्डआउट का उपयोग किया है, लेकिन अगर मुझे सही याद है, तो एक पाइप रेसिपी है जो आपको पीआईपी आवश्यकताओं की फाइलों का उपयोग करने की अनुमति देती है। आप एक आवश्यकता फ़ाइल बना सकते हैं जिसमें इस तरह कुछ शामिल है:

-e git+http://<github url> 

यह इंस्टॉल करते समय स्थानीय रूप से पैकेज को चेक करेगा।

+0

यह दिलचस्प है .. इसे जांच लेंगे। –

0

क्या मैं लाइब्रेरी पर अपनी पीईपीआई पर अपना स्वयं का अपलोड अपलोड करता हूं और इसे अपने नाम से उपसर्ग करता हूं?

सं

कि अनावश्यक रूप से सूचकांक को दूषित नहीं होगा?

जाहिर है। (साथ ही, आप मानते हैं कि आपका एक्सटेंशन वास्तव में दूसरों के लिए उपयोगी है। यह संभवतः किसी के लिए उपयोगी नहीं हो सकता है। वास्तव में, आपका एक्सटेंशन पैकेज को समझने में विफलता का संकेत दे सकता है।)

या मैं अपना खुद का इंडेक्स और पैकेज रेपो बना और रखता हूं?

कभी नहीं। यह पूरी तरह से मूर्ख है। आपके पास संशोधित पैकेज है। जब तक आप पीपीपीआई के खिलाफ पूरा नहीं करेंगे तब तक आपको एक भंडार की आवश्यकता नहीं है। आप कोशिश कर सकते हैं, लेकिन परेशान क्यों?


यहां आप क्या करते हैं।

विस्तार

आप आसानी से संशोधित करने या forking बिना उसकी पैकेज का विस्तार कर सकते हैं।

my_paypal.py

from paypal import * 

class MyFancyExtension(SomeExistingClass): 
    def override(self, ...) 

def my_other_extension(...): 
    this() 
    that() 

यह काफी आसान है। यह अक्सर फोर्किंग से बेहतर होता है क्योंकि आप अपने एक्सटेंशन द्वारा छेड़छाड़ किए गए मूल पैकेज को सुरक्षित रखते हैं।

+0

मैं ऐसा कर सकता था, लेकिन मैं पुस्तकालय में सुधार करना चाहता हूं और अपस्ट्रीम में बदलाव करना चाहता हूं। मैं इसे अपनी कई परियोजनाओं के लिए निर्भरता के रूप में भी उपयोग कर रहा हूं। उस पर आधारित एक निजी रेपो होस्ट करना सबसे अच्छा हो सकता है और जब यह पकड़ता है तो मुख्य पर वापस आ जाता है। –

+0

ध्यान दें कि कस्टम पीईपीआई सर्वर ("इंडेक्स और पैकेज रेपो") रखने के बिल्कुल अच्छे कारण हैं। – Petri

0

यह आपके स्वामित्व, निजी, फोर्क या विकास पैकेज के लिए अपना स्वयं का कस्टम पीईपीआई सर्वर रखने का सही अर्थ बनाता है।

उदाहरण के लिए pypiserver हल्का और स्थापित करने में आसान है।

संबंधित मुद्दे