2009-07-15 21 views
20

एक setup.py setuptools का उपयोग करता है के साथ एक अजगर पैकेज पैकेजिंग जब:मैं सेटअपtools subversion सूची को अनदेखा कैसे कर सकता हूं?

from setuptools import setup 
... 

स्रोत द्वारा बनाई वितरण:

python setup.py sdist 

न केवल शामिल है, हमेशा की तरह, फ़ाइलों को मालसूची में निर्दिष्ट। में, लेकिन यह भी, मुफ्त में, उन सभी फ़ाइलों को शामिल करता है जो सबवर्सन को पैकेज निर्देशिका के नीचे नियंत्रित संस्करण के रूप में सूचीबद्ध करता है। यह काफी परेशान है। न केवल मेरे पैकेज के साथ कौन सी फाइलें वितरित की जाती हैं, इस पर किसी भी प्रकार के स्पष्ट नियंत्रण का प्रयोग करना मुश्किल हो जाता है, लेकिन इसका मतलब है कि जब मैं "svn checkout" के बजाय "svn export" के बाद अपना पैकेज बनाता हूं, तो मेरी सामग्री पैकेज काफी अलग हो सकता है, क्योंकि .svn metadata setuptools के बिना क्या शामिल करना है इसके बारे में अलग-अलग विकल्प बनायेगा।

मेरा प्रश्न: मैं इस भयानक व्यवहार को कैसे बंद कर सकता हूं, ताकि "setuptools" मेरे प्रोजेक्ट का वैसे ही व्यवहार करे, चाहे मैं सबवर्जन का उपयोग कर रहा हूं या संस्करण नियंत्रण जिसे कभी नहीं सुना है, या "svn" निर्यात "है कि मैंने यह सुनिश्चित करने के लिए अपनी परियोजना के अंत में बनाया है कि यह मेरी कार्यशील निर्देशिका के अलावा कहीं और साफ बनाता है?

सबसे अच्छा मैं अब तक कामयाब रहे एक बदसूरत बंदर-पैच है:

from setuptools.command import sdist 
del sdist.finders[:] 

लेकिन यह, अजगर, नहीं जंगल है, तो निश्चित रूप से मैं एक बेहतर समाधान है कि सभी में कोई बंदरों शामिल करना चाहते हैं। मैं setuptools को कैसे रोक सकता हूं, अपने जादू को बंद कर सकता हूं, और इसके बजाय मेरे MANIFEST.py में दृश्यमान, अनुमानित नियमों को देखकर समझदारी से व्यवहार कर सकता हूं?

+0

मुझे लगता है कि मुझे यहां एक ही समस्या है, केवल .git और py2app के साथ: http://stackoverflow.com/questions/9845590/py2app-picking-up-git-subdir-of-a-package-during -बिल्ड – jdi

+0

वाह, यह * एक ही समस्या की तरह दिखता है! –

+0

मैंने अपने स्वयं के प्रश्न के उत्तर के रूप में एक बंदरगाह हैक पोस्ट किया। हैवेन्ट ने अभी तक कुछ भी बेहतर पाया है – jdi

उत्तर

15

मैं तुम्हें इस बारे में ज्यादा, ब्रैंडन पता पता है, लेकिन मैं एक पूरा जवाब के रूप में देने के लिए के रूप में मैं (हालांकि मुझे पता नहीं setuptools gury हूँ कर सकते हैं की कोशिश करेंगे) दूसरों के लाभ के लिए।

समस्या यह है कि setuptools में खुद को बहुत सारे काले जादूगर शामिल होते हैं, जिसमें setuptools.file_finders नामक एंट्री पॉइंट का उपयोग करना शामिल है, जहां आप फ़ाइलों को शामिल करने के लिए प्लगइन जोड़ सकते हैं। मैं कर रहा हूँ, फिर भी, यह कैसे से प्लग-इन को दूर करने के रूप में एक पूरा नुकसान पर ...

  • त्वरित वैकल्पिक हल: SVN एक अस्थायी निर्देशिका के लिए अपने पैकेज निर्यात और वहां से setup.py चलाते हैं। इसका मतलब है कि आपके पास कोई svn नहीं है, इसलिए svn खोजक को शामिल करने के लिए कोई फ़ाइल नहीं मिलती है। :)

  • लंबे कामकाज: क्या आपको वास्तव में सेटअपtools की आवश्यकता है? Setuptools में बहुत सारी विशेषताएं हैं, इसलिए उत्तर हां संभवतः है, लेकिन मुख्य रूप से उन विशेषताओं में डिस्पेंडेसी हैं (इसलिए आपकी निर्भरता easy_install द्वारा इंस्टॉल की जाती है), नेमस्पेस पैकेज (foo.bar), और प्रविष्टि बिंदु। नेमस्पेस पैकेज वास्तव में सेटअपtools के बिना भी बनाया जा सकता है। लेकिन यदि आप इनमें से कोई भी उपयोग नहीं करते हैं तो आप वास्तव में distutils का उपयोग कर दूर हो सकता है।

  • बदसूरत कामकाज: आपके प्रश्न में एसडीआईस्ट को जो बंदरगाह दिया गया है, जो प्लगइन को कोई खोजकर्ता नहीं बनाता है, और जल्दी से बाहर निकलता है।

तो जैसा कि आप देख, इस सवाल का जवाब है, हालांकि के रूप में पूरा के रूप में मैं यह कर सकते हैं, अभी भी शर्मनाक अधूरा है। मैं वास्तव में आपके प्रश्न का उत्तर नहीं दे सकता, हालांकि मुझे लगता है कि जवाब "आप नहीं कर सकते"।

1

शायद उत्तर आपके setup.py में है। क्या आप find_packages का उपयोग करते हैं? डिफ़ॉल्ट रूप से यह फ़ंक्शन VCS का उपयोग करता है (उदा। Subversion, hg, ...)। यदि आपको यह पसंद नहीं है, तो बस एक अलग पायथन फ़ंक्शन लिखें जो केवल वही चीज़ें एकत्र करता है जो आप चाहते हैं।

+0

find_packages स्वयं ही listdir का उपयोग करता है, वास्तव में, और '__init __। Py' नाम की फ़ाइलों को देखता है। –

-1

आप शायद कुछ इस तरह हैं:

from distutils.core import setup 

def packages(): 
    import os 

    packages = [] 

    for path, dirs, files in os.walk("yourprogram"): 
     if ".svn" in dirs: 
      dirs.remove(".svn") 

     if "__init__.py" in files: 
      packages.append(path.replace(os.sep, ".")) 

    return packages 

setup(
    # name, version, description, etc... 

    packages = packages(), 

    # pacakge_data, data_files, etc... 
) 
+1

+1: जो लोग डाउनवोट करते हैं, उनके लिए कृपया एक स्पष्टीकरण दें कि पोस्ट क्यों अमान्य है। यह दृष्टिकोण बहुत अच्छा काम करता प्रतीत होता है। –

0

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

sdist से bdist_egg की तुलना करें; मैं केवल उन फ़ाइलों को शर्त लगाता हूं जो स्पष्ट रूप से निर्दिष्ट किए गए हैं।

मैंने तीन फाइलों के साथ एक सरल परीक्षण किया, सब svn में। खाली dummy.lkj और foobar.py और साथ setup.py इस तरह लग रही:

import setuptools 
setuptools.setup(name='foobar', version='0.1', py_modules=['foobar']) 

sdist एक टारबॉल कि dummy.lkj शामिल पैदा करता है। bdist_egg एक अंडे बनाता है जिसमें dummy.lkj शामिल नहीं है।

9

के साथ एक MANIFEST.in फ़ाइल बनाएँ:

recursive-exclude . 
# other MANIFEST.in commands go here 
# to explicitly include whatever files you want 

MANIFEST.in वाक्य रचना के लिए http://docs.python.org/distutils/commandref.html#sdist-cmd देखें।

+0

यह मेरे लिए एक त्रुटि उत्पन्न करता है। मुझे 'रिकर्सिव-बहिष्कार' का उपयोग करना पड़ा। * '। –

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