יצירת חבילת pip ב-5 דקות

מבוא

כתבנו קוד, אנחנו מרוצים ממנו וחושבים שהוא יכול להועיל לעוד אנשים, אולי בתוך אותו ארגון בו אנחנו עובדים ואולי פשוט להוציא את החבילה לשימוש העולם.

יש הרבה דרכים לחלוק קוד עם הקהילה, אבל אחת הנפוצות מבניהן היא יצירת חבילה שכל מה שהמשתמש יצטרך לעשות על מנת לצרוך אותה זה pip install.

בפוסט הזה נדבר שלב אחרי שלב על איך יוצרים חבילת pip, מעלים אותה לשרת החבילות pypi.org ומתקינים היכן שרק נרצה.

חשוב לציין של-setuptools קיימים פיצ'רים רבים וחלקם גם מורכבים, שלא אגע ברובם. להרחבת הקריאה אני ממליץ כמו תמיד לגשת לדוקומנטציה הרשמית.

למה לא סתם פרויקט בגיט שעושים לו clone? או אפילו git submodule?

אם אני עובד בחברה, ובחברה הזו יש צוות שצריך ממני את הקוד שכתבתי, הוא יכול לצרוך אותו בעוד דרכים כמו clone או submodule. למה בעצם לא ללכת בדרך הזו?

התשובה הפשוטה היא כי זה לא מסודר. pip מהווה עבורנו ניהול מסודר של חבילות וגם של תתי-התלויות שלהן. כשאנחנו עובדים מול גיט בתצורה של submodule או clone לפרויקט אנחנו צריכים לנהל בעצמנו את הגרסאות, ומכיוון שגיט עובד לפי commits, נצטרך להתקין את החבילה כל פעם לפי הקומיט שלנו ולעדכן אותו כשנצטרך. אם נרצה לחזור אחורה לגרסה ישנה יותר נצטרך לחפש את הקומיט הנכון לחזור אליו וזה בסבירות גבוהה יעכב אותנו ויהפוך את ניהול החבילות לעבודת נמלים.

איך יוצרים חבילת pip

* כמו תמיד אני ממליץ לעבוד מתוך סביבה וירטואלית, אם אינכם יודעים איך לעשות זאת תמצאו מדריך כאן.

1. נתקין את התלויות הנדרשות:
pip install --upgrade pip setuptools wheel twine
בפקודה הזו התקנו/שדרגנו את:
pip - על מנת לקבל חבילות מעודכנות.
setuptools - החבילה שבאמצעותה יוצרים חבילות.
wheel - החבילה שמוסיפה את הפקודה bdsit_wheel לsetuptools ומאפשרת ליצור קובץ whl אותו ניתן יהיה להתקין בפשטות.
twine - החבילה שמאפשרת העלאות פשוטות ובטוחות ל PyPi על גבי HTTPS.

2. ניצור את החבילה:
setuptools בפייתון הפכו את הסיפור לנוח (באופן יחסי), כל שנצטרך לעשות זה לשים תחת תיקייה בפרויקט שלנו (עדיף בתיקייה הראשית) קובץ. לקובץ נקרא כרגע setup.py אם כי זה לא מאוד משנה.

import setuptools

setuptools.setup(
    name="my-package-name",
    version="0.0.1",
    author="TomerCode",
    author_email="TomerCode@example.com",
    description="A small example package",
    long_description="my long description",
    url="https://github.com/MyUser/MyProject",
    packages=setuptools.find_packages(),
    classifiers=[
        "Programming Language :: Python :: 3",
        "License :: OSI Approved :: MIT License",
        "Operating System :: OS Independent",
    ],
    python_requires='>=3.6',
)                                                                                                                                                    


תוכן הקובץ יראה כך.
מה שקורה כאן בעצם זה שיש לנו פונקציה בשם setup לה אנחנו נותנים את כל ה metadata של החבילה שלנו כפרמטרים.

אינני הולך לעבור על כל פרמטר כי השמות שלהם די מסבירים את עצמם. שני פרמטרים שכן חשוב להזכיר הם python_requires - שבאמצעותו אנחנו מגדירים את גרסת הפייתון הנדרשת/מינימלית/מקסימלית עבור החבילה שלנו. ו packages - שבו אנחנו נספק את כל תתי החבילות בפרויקט שלנו, למזלנו setuptools יצרו עבורנו את הקסם שנקרא find_packages שעובר על הפרויקט ומביא את החבילות עבורנו.

3. נקמפל את החבילה לקובץ התקנה:
כעת ניגש ל terminal מתוך הסביבה הוירטואלית שלנו ונריץ את setup.py עם הפרמטר bdist_wheel באופן הבא: python setup.py sdist bdist_wheel

מיד לאחר שנעשה זאת נוכל לראות התווספו לנו לתיקייה קבצים חדשים ותיקיות, בניהם קובץ עם סיומת whl תחת התיקיה dist. זהו הקובץ אותו ניתן להתקין באמצעות pip.

בכדי לבדוק שהכל עבד בהצלחה הריצו את pip install עם קובץ ה whl כפרמטר:

(pypi-venv) tomercodes-MacBook-Pro:tomercode-pypi tomercode$ pip install dist/tomercode-0.0.1-py3-none-any.whl
Processing ./dist/tomercode-0.0.1-py3-none-any.whl
Installing collected packages: tomercode
Successfully installed tomercode-0.0.1

איך מעלים את החבילה ל pypi

תחילה עלינו ליצור משתמש כמובן - אם לא היה ניהול משתמשים מסודר כל אחד יכל לעדכן גרסה בכל חבילה. נעשה זאת באמצעות הקישור הבא.

על מנת להעלות את הקובץ כל שנצטרך להריץ זה את הפקודה 
twine upload dist/*

זה יראה בערך כך:

(pypi-venv) tomercodes-MacBook-Pro:tomercode-pypi tomercode$ twine upload dist/tomercode-0.0.3-py3-none-any.whl
Uploading distributions to https://upload.pypi.org/legacy/
Enter your username: tomercoden
Enter your password:
Uploading tomercode-0.0.3-py3-none-any.whl
100%|██████████████████████████████████████████████████████████████████████████████████████████████████████████| 4.73k/4.73k [00:01<00:00, 2.65kB/s]

View at:
https://pypi.org/project/tomercode/0.0.3/


וכעת נוכל להשתמש בחבילה שיצרנו באופן הבא:

(pypi-venv) tomercodes-MacBook-Pro:tomercode-pypi qa$ python
Python 3.8.6 (default, Oct 25 2020, 14:02:09)
[Clang 11.0.0 (clang-1100.0.33.17)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> from tomercode import tomercode_hello
>>> tomercode_hello.say_hello()
hello                                                                                                                                                                                                            


וזהו, יצרנו חבילת pip ולמהדרין!

סיכום

בפוסט ראינו כמה פשוטה יצירת חבילות pip בפייתון, עכשיו אני קורא לכם לשאול את עצמכם. האם יש מקום בו אני יכול לתרום קוד שכתבתי לשימוש חוזר? אולי בתוך החברה בין צוותים ואולי סתם לקהילה?

נתראה בפוסט הבא :)

תגובות

פוסטים פופולריים מהבלוג הזה

מהם קבצי DLL ואיך להשתמש בהם?

מדריך C# | שימוש ב LINQ

תכנות מונחה עצמים | Dependency Inversion Principle