Как да използвам GitHub като PyPi сървър

Търсих хостван частен сървър на PyPi Python Package, който използваше идентификационни данни, които екипът вече има (като GitHub).

Не исках да създавам локален сървър. За нас това би направило невъзможно използването на базирани на облак сървъри за изграждане и това е друга движеща се част, която може да се обърка. Съществуват и потенциални проблеми с фината сигурност и скорост. (Имаме световен екип, така че обслужването на съдържанието чрез CDN би било полезно.)

Не исках да принуждавам екипа да създава акаунти с друг доставчик. Те вече имат акаунти в Active Directory и GitHub. Това е досада за тях и създава управленска тежест за мен.

За съжаление не можах да намеря такава услуга. GemFury е отличен, но не поддържа оторизация на GitHub (на ниво екип / организация), а Packagr изобщо не поддържа оторизация на GitHub. MyGet също е отличен, позволява ми да използвам оторизация на GitHub, но не хоства Python пакети. Azure DevOps има нещо, което изглежда обещаващо, но в момента е в частна бета версия.

За щастие това е възможно с помощта на облачни хранилища Git като GitHub, GitLab и BitBucket.

Pip може да инсталира пакети от Git

Хоствал съм пакет Python на GitHub (python_world), който можете да инсталирате със следната команда (уверете се, че ми се доверявате, преди да стартирате тази команда и да инсталирате кода си на вашия компютър).

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

Pip предоставя опции за инсталиране от head, от клон, от етикет или от фиксиране. Обикновено маркирам всяко издание и инсталирам от тези тагове. Вижте документацията за инсталиране на pip за пълни подробности.

Това хранилище е публично, но работи по същия начин с частно репо, стига да имате разрешение. Няма специална магия (това е ванилов пакет Python) и Setup.py върши по-голямата част от работата както обикновено.

Ако не сте начинаещи в създаването на Python Packages, урокът за Packaging Python Projects си заслужава бързо четене.

Инструментите за настройка могат също да инсталират зависимости от 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 без среда, знае, средата спестява много разочарования и загуба на време. Затова трябва да ги подкрепим.

Създадох репо (use-hello-world), което определя python_helloкато зависимост в requirements.txt за Virtualenv и environment.yml за Conda.

Ако изтеглите репото, можете да инсталирате зависимостите във 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 Pages. Има еквивалентни неща за GitLab и BitBucket. Можете да видите, че изходният код е много прост. Сайтовете на GitHub Pages винаги са публични (и вероятно в индекса ви няма чувствителна информация). Ако обаче ви трябват да са частни, можете да използвате услуга като PrivateHub.

Трябва да се внимава за нормализиране на името на спецификацията. Това изисква python_helloинформацията за пакета да присъства на python-hello/index.html(обърнете внимание на промяната от долната черта към тирето).

Сега, когато имаме PyPi сървър, можем да инсталираме пакети, като използваме командата по-долу.

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

За да можете да видите това как работи със среди, създадох друго репо (use_hello_world_from_server), което дефинира python_helloзависимостта, използвайки този PyPi индекс вместо директни връзки GitHub. Ако го пробвате с Conda, е необходима версия> 4.4.

На този етап можем да се върнем и да премахнем директната връзка към Git в install_requires в setup.py на python_hello (тъй като Setuptools ще могат да я намерят от нашия сървър).

Заключения

Използването на доставчик на Git, хостван в облак, като PyPi сървър е жизнеспособна опция. Ако вече използвате такъв, това означава, че можете да използвате повторно идентификационните данни и разрешенията, които вече имате. Той ще работи със сървъри за изграждане в облак и вероятно ще бъде предоставен чрез CDN, така че ще бъде бърз в целия свят. Това изисква повече знания за настройване от хоствания сървър, но вероятно същото или по-малко от хостинг на вашия собствен сървър на място.

Съвети и съвети

Локалното обслужване на индекса може да помогне за отстраняване на проблеми (като нормализиране на имената). Лесно е да видите какви заявки се отправят. Можете да използвате вградения HTTP сървър на python за това ( python -m Http.Server -8000). Това ме накара да разбера, че pip searchизползва postзаявки, така че няма да работи със страници на GitHub.

Можете да стартирате, за python setup.py -installда проверите вашите пип пакети локално, преди да ги натиснете в Git.