هل هناك طريقة أسهل للتجميع مع بيثون؟
-
28-09-2019 - |
سؤال
حاولت حزم تطبيق Django اليوم. إنه طفل كبير ، ومع ملف الإعداد ، يجب أن أكتب يدويًا جميع الحزم والحزم الفرعية في المعلمة "الحزمة". ثم يجب أن أجد طريقة لنسخ المباريات ، ملفات HTMLS / CSS / Image ، المستندات ، إلخ.
إنها طريقة فظيعة للعمل. نحن علماء كمبيوتر ، نحن نتعامل مع هذا ، لا معنى له.
وماذا عندما أقوم بتغيير بنية التطبيق الخاصة بي؟ لا بد لي من إعادة كتابة setup.py.
هل هناك طريقة أفضل ؟ بعض الأدوات لأتمتة ذلك؟ لا أستطيع أن أصدق لغة من وقت مطور القيمة مثل Python يجعل العبوة مثل هذا العمل.
أريد أن أكون قادرًا على تثبيت التطبيق في النهاية باستخدام تثبيت PIP بسيط. أعرف أن البناء ، لكنه ليس أبسط بكثير ، وليس صديقًا لـ PIP.
المحلول
على الأقل إذا كنت تستخدم setuptools
(بديل لـ Stdlib's distutils
) تحصل على وظيفة رائعة تسمى find_packages()
الذي عندما يتم تشغيله من الجذر الحزمة يرجع قائمة بأسماء الحزم في نقاط مناسبة ل packages
معامل.
هنا مثال:
# setup.py
from setuptools import find_packages, setup
setup(
#...
packages=find_packages(exclude='tests'),
#...
)
PS Packaging تمتص في كل لغة وكل نظام. تمتص بغض النظر عن كيفية تقطيعها.
نصائح أخرى
لقد مررت بهذا الألم بنفسي اليوم. لقد استخدمت ما يلي ، yoinked مباشرة من setup.py Django, ، الذي يمشي نظام ملفات التطبيق يبحث عن الحزم وملفات البيانات (على افتراض أنك لا تخلط بين الاثنين):
import os
from distutils.command.install import INSTALL_SCHEMES
def fullsplit(path, result=None):
"""
Split a pathname into components (the opposite of os.path.join) in a
platform-neutral way.
"""
if result is None:
result = []
head, tail = os.path.split(path)
if head == '':
return [tail] + result
if head == path:
return result
return fullsplit(head, [tail] + result)
# Tell distutils to put the data_files in platform-specific installation
# locations. See here for an explanation:
# http://groups.google.com/group/comp.lang.python/browse_thread/thread/35ec7b2fed36eaec/2105ee4d9e8042cb
for scheme in INSTALL_SCHEMES.values():
scheme['data'] = scheme['purelib']
# Compile the list of packages available, because distutils doesn't have
# an easy way to do this.
packages, data_files = [], []
root_dir = os.path.dirname(__file__)
if root_dir != '':
os.chdir(root_dir)
myapp_dir = 'myapp'
for dirpath, dirnames, filenames in os.walk(myapp_dir):
# Ignore dirnames that start with '.'
for i, dirname in enumerate(dirnames):
if dirname.startswith('.'): del dirnames[i]
if '__init__.py' in filenames:
packages.append('.'.join(fullsplit(dirpath)))
elif filenames:
data_files.append([dirpath, [os.path.join(dirpath, f) for f in filenames]])
أعتقد أن الأداة التي تبحث عنها بناء خارج. هناك الكثير من الأماكن التي يمكنك من خلالها معرفة المزيد عنها الشرائح إلى أشرطة الفيديو Pycon.
تتضمن الأدوات الأخرى المماثلة أو ذات الصلة التي قد ترغب في التحقق منها VirtualEnv ، النسيج ، و pip.
لقد كنت أقوم ببعض الأبحاث بنفسي حول أساليب نشر Django مؤخرًا.
لقد وجدت هذين الموارد مفيدة للغاية:
- http://www.caktusgroup.com/blog/2010/04/22/basic-django-deployment-with-virtualenv-fabric-pip-and-rsync/ - نظرة عامة أساسية على كيفية استخدام VirtualEnv و PIP و Fabric للقيام بنشر Django السهل من جهاز Dev إلى الإنتاج.
- https://github.com/jacobian/django-deployment-workshop/ - قام يعقوب (إيان) بعمل ورشة عمل لنشر Django ، مع نشر جميع الكود على Github. جميع الروابط اللازمة موجودة أيضًا.