Πώς να χρησιμοποιήσετε το GitHub ως διακομιστή PyPi

Έψαχνα για έναν φιλοξενούμενο ιδιωτικό διακομιστή PyPi Python Package, που χρησιμοποίησε διαπιστευτήρια που έχει ήδη η ομάδα (όπως το GitHub).

Δεν ήθελα να δημιουργήσω έναν διακομιστή εσωτερικής εγκατάστασης. Για εμάς, θα καθιστούσαμε αδύνατη τη χρήση διακομιστών build που βασίζονται σε σύννεφο και είναι ένα άλλο κινούμενο μέρος που μπορεί να πάει στραβά. Υπάρχουν επίσης πιθανά ζητήματα σχετικά με την ακριβή ασφάλεια και ταχύτητα. (Έχουμε μια παγκόσμια ομάδα, επομένως η εξυπηρέτηση του περιεχομένου μέσω CDN θα ήταν χρήσιμη.)

Δεν ήθελα να αναγκάσω την ομάδα να δημιουργήσει λογαριασμούς με άλλο πάροχο. Έχουν ήδη λογαριασμούς Active Directory και GitHub. Είναι μια ενόχληση για αυτούς και δημιουργεί ένα βάρος διακυβέρνησης για μένα.

Δυστυχώς, δεν μπορούσα να βρω μια τέτοια υπηρεσία. Το GemFury είναι εξαιρετικό, αλλά δεν υποστηρίζει την εξουσιοδότηση GitHub (σε επίπεδο ομάδας / οργανισμού) και το Packagr δεν υποστηρίζει καθόλου την εξουσιοδότηση GitHub. Το MyGet είναι επίσης εξαιρετικό, μου επιτρέπει να χρησιμοποιώ την εξουσιοδότηση GitHub, αλλά δεν φιλοξενεί πακέτα Python. Το Azure DevOps έχει κάτι που φαίνεται πολλά υποσχόμενο, αλλά αυτή τη στιγμή βρίσκεται σε ιδιωτικό beta.

Ευτυχώς, αυτό είναι δυνατό με τη χρήση αποθετηρίων cloud Git όπως το GitHub, το GitLab και το BitBucket.

Το Pip μπορεί να εγκαταστήσει πακέτα από το Git

Έχω φιλοξενήσει ένα πακέτο Python στο GitHub (python_world), το οποίο μπορείτε να εγκαταστήσετε με την ακόλουθη εντολή (βεβαιωθείτε ότι με εμπιστεύεστε πριν εκτελέσετε αυτήν την εντολή και εγκαταστήσετε τον κωδικό μου στον υπολογιστή σας).

pip install git+//github.com/ceddlyburge/python_world#egg=python_world

Το Pip παρέχει επιλογές για εγκατάσταση από το κεφάλι, από έναν κλάδο, από μια ετικέτα ή από μια δέσμευση. Συνήθως επισημαίνω κάθε έκδοση και εγκαθιστώ από αυτές τις ετικέτες. Δείτε την τεκμηρίωση εγκατάστασης pip για πλήρεις λεπτομέρειες.

Αυτό το αποθετήριο είναι δημόσιο, αλλά λειτουργεί το ίδιο με ένα ιδιωτικό repo, αρκεί να έχετε άδεια. Δεν υπάρχει ιδιαίτερη μαγεία (είναι ένα πακέτο βανίλιας Python) και το Setup.py κάνει το μεγαλύτερο μέρος της δουλειάς του ως συνήθως.

Εάν είστε νέοι στη δημιουργία πακέτων Python, το σεμινάριο Packaging Python Projects αξίζει μια γρήγορη ανάγνωση.

Τα Setuptools μπορούν επίσης να εγκαταστήσουν εξαρτήσεις από το Git

Το Setuptools είναι ο τρόπος με τον οποίο οι περισσότεροι άνθρωποι δημιουργούν πακέτα Python.

Έχω φιλοξενήσει ένα άλλο πακέτο στο GitHub python_hello, το οποίο εξαρτάται από το python_world. (Είμαι σίγουρος ότι μπορείτε να δείτε πού πηγαίνει αυτό.)

Τα σχετικά κομμάτια από το setup.py είναι παρακάτω. install_requiresκαθορίζει ότι python_worldείναι μια απαιτούμενη εξάρτηση και λέει στο Setuptools πού να το βρει.

install_requires=[ '[email protected]+//github.com/ceddlyburge/python_world#egg=python_world-0.0.1', ]

Μπορείτε να εγκαταστήσετε αυτό το πακέτο χρησιμοποιώντας την παρακάτω εντολή. Θα κατεβάσει επίσης το python_worldπακέτο που εξαρτάται .

pip install git+//github.com/ceddlyburge/python_hello#egg=python_hello

Αυτό συνδέεται με μια συγκεκριμένη έκδοση python_world, η οποία είναι κρίμα, καθώς σημαίνει ότι το pip δεν μπορεί να κάνει καμία διαχείριση εξάρτησης (όπως η επεξεργασία μιας αποδεκτής έκδοσης εάν εξαρτώνται από πολλά πράγματα). Ωστόσο, μέχρι το τέλος αυτού του άρθρου, θα έχουμε καταργήσει την ανάγκη για τον συγκεκριμένο σύνδεσμο.

Περιβάλλοντα Python

Όπως γνωρίζουν όλοι όσοι χρησιμοποίησαν το Python χωρίς περιβάλλον, τα περιβάλλοντα εξοικονομούν μεγάλη απογοήτευση και σπατάλη χρόνου. Πρέπει λοιπόν να τα υποστηρίξουμε.

Έχω δημιουργήσει ένα repo (use-hello-world) που ορίζει python_helloως εξάρτηση από τις απαιτήσεις.txt για το Virtualenv και το environment.yml για το Conda.

Εάν κάνετε λήψη του repo, μπορείτε να εγκαταστήσετε τις εξαρτήσεις σε ένα virtualenv με την ακόλουθη εντολή.

pip install -r requirements.txt

Εάν χρησιμοποιείτε conda μπορείτε να χρησιμοποιήσετε αυτήν την εντολή:

conda env create -n use-hello-world

Ευρετήριο PyPi

Μέχρι στιγμής είμαστε σε θέση να εγκαταστήσουμε πακέτα από τα ιδιωτικά μας αποθετήρια Git. Αυτά τα πακέτα μπορούν, με τη σειρά τους, να καθορίσουν εξαρτήσεις σε άλλα ιδιωτικά αποθετήρια. Δεν υπάρχει ακόμα διακομιστής PyPi.

Θα μπορούσαμε να σταματήσουμε σε αυτό το σημείο. Ωστόσο, η σύνταξη για τον ορισμό των εξαρτήσεων είναι λίγο μυστηριώδης. Θα ήταν δύσκολο για την ομάδα να ανακαλύψει ποια πακέτα είναι διαθέσιμα και συνδέουμε με συγκεκριμένες εκδόσεις εξαρτημένων πακέτων, αντί να αφήσουμε το pip να το διαχειριστεί.

Για να το διορθώσουμε αυτό μπορούμε να δημιουργήσουμε ένα ευρετήριο PyPi που να συμμορφώνεται με το Pep 503. Αυτή η προδιαγραφή είναι αρκετά απλή και μόλις δημιούργησα το ευρετήριο με το χέρι. Εάν αυτό γίνει πολύ δυσκίνητο, μπορώ να το δημιουργήσω από το GitHub API.

Δημιούργησα αυτό το ευρετήριο PyPi χρησιμοποιώντας τις σελίδες GitHub. Υπάρχουν ισοδύναμα πράγματα για το GitLab και το BitBucket. Μπορείτε να δείτε ότι ο πηγαίος κώδικας είναι πολύ απλός. Οι ιστότοποι των σελίδων GitHub είναι πάντα δημόσιοι (και πιθανώς δεν υπάρχουν ευαίσθητες πληροφορίες στο ευρετήριό σας). Ωστόσο, εάν θέλετε να είναι ιδιωτικοί, μπορείτε να χρησιμοποιήσετε μια υπηρεσία όπως το PrivateHub.

Ένα πράγμα που πρέπει να προσέξετε είναι η ομαλοποίηση του ονόματος της προδιαγραφής. Αυτό απαιτεί την παρουσίαση των python_helloπληροφοριών πακέτου python-hello/index.html(σημειώστε την αλλαγή από μια υπογράμμιση σε παύλα).

Τώρα που έχουμε διακομιστή PyPi, μπορούμε να εγκαταστήσουμε πακέτα χρησιμοποιώντας την παρακάτω εντολή.

pip install python_hello --extra-index-url //ceddlyburge.github.io/python-package-server/

Για να μπορείτε να το δείτε αυτό να λειτουργεί με περιβάλλοντα, έχω δημιουργήσει ένα άλλο repo (use_hello_world_from_server) που καθορίζει την python_helloεξάρτηση χρησιμοποιώντας αυτό το ευρετήριο PyPi αντί για απευθείας GitHub Links. Εάν το δοκιμάζετε με Conda, απαιτείται έκδοση> 4.4.

Σε αυτό το σημείο, μπορούμε να επιστρέψουμε και να αφαιρέσουμε τον άμεσο σύνδεσμο Git στο install_requires στο setup.py του python_hello (καθώς το Setuptools θα μπορεί να το βρει από τον διακομιστή μας).

Συμπεράσματα

Η χρήση ενός παρόχου Git που φιλοξενείται σε cloud ως διακομιστή PyPi είναι μια βιώσιμη επιλογή. Εάν χρησιμοποιείτε ήδη ένα, αυτό σημαίνει ότι μπορείτε να χρησιμοποιήσετε ξανά τα διαπιστευτήρια και τα δικαιώματα που έχετε ήδη. Θα λειτουργεί με διακομιστές Cloud build και είναι πιθανό να παρέχεται μέσω CDN, έτσι θα είναι γρήγορος παγκοσμίως. Απαιτεί περισσότερες γνώσεις για τη ρύθμιση από έναν φιλοξενούμενο διακομιστή, αλλά πιθανώς το ίδιο ή λιγότερο από τη φιλοξενία του δικού σας διακομιστή στις εγκαταστάσεις

Συμβουλές και συμβουλές

Η τοπική εξυπηρέτηση του ευρετηρίου μπορεί να βοηθήσει στην αντιμετώπιση προβλημάτων (όπως ομαλοποίηση ονόματος). Είναι εύκολο να δείτε ποια αιτήματα υποβάλλονται. Μπορείτε να χρησιμοποιήσετε τον ενσωματωμένο διακομιστή HTTP python για αυτό ( python -m Http.Server -8000). Αυτό με οδήγησε να ανακαλύψω ότι pip searchχρησιμοποιεί postαιτήματα, οπότε δεν θα λειτουργεί με τις σελίδες του GitHub.

Μπορείτε να τρέξετε python setup.py -installγια να ελέγξετε τα πακέτα pip σας τοπικά, προτού τα πιέσετε στο Git.