Как создать локальный собственный индекс хранилища Pypi без зеркала?
У нас есть несколько собственных пакетов Python, и мы хотим создать для них локальный репозиторий pypi, используя простой интерфейс, такой как https://pypi.python.org/simple/
Этот репозиторий я хочу создать только для локальных без каких-либо зеркал по соображениям безопасности, и он будет поставлен под контроль Apache
Команда pypimirror
Внешний вид должен быть инициализирован один раз, что необходимо для отражения.
Как я могу создать простой индекс PyPi на основе локальных пакетов Python.
Любые другие простые сценарии для этого?
5 ответов
Так как вы попросили ответить здесь:
Взгляни на pip2pi
Кажется, это именно то, что вы ищете.
У нас была похожая потребность в моей компании. В основном, как мы можем выгрузить пакеты с "закрытым исходным кодом" в индекс, имея возможность устанавливать их, как если бы они были в PyPI?
Мы спонсировали проект под названием devpi, который действует как кэш PyPI (пакеты, к которым вы получаете доступ из PyPI, будут кэшироваться на вашем сервере), а также как мощный и быстрый сервер индексирования. Документация доступна по адресу http://doc.devpi.net/latest/.
Следующим на дорожной карте является зеркалирование для развертывания нескольких гео. Чтобы разогнать шины на машине, требуется около 5 минут (см. Руководства по быстрому запуску). Наконец, devpi совместим как с pip, так и с easy_install (т.е. вам не нужен клиент devpi, установленный на вашем компьютере).
Надеюсь, это поможет.
Самый простой способ - организовать дистрибутивные пакеты в каталоги с именами пакетов и запустить простой HTTP-сервер. Никаких дополнительных пакетов не требуется, достаточно stdlib Python. Пример структуры каталогов:
└── repodir
├── setuptools
│ └── setuptools-38.1.0-py2.py3-none-any.whl
│ └── setuptools-38.1.0.zip
│ └── setuptools-39.2.0-py2.py3-none-any.whl
│ └── setuptools-39.2.0.zip
├── wheel
│ └── wheel-0.31.1-py2.py3-none-any.whl
...
Запустите сервер:
$ cd repodir/
$ python3 -m http.server -p 9000
$ # or for Python 2:
$ python2 -m SimpleHTTPServer -p 9000
Местное репо запущено и работает. Теперь вы можете передать репо в pip
:
$ pip install wheel --extra-index-url=http://127.0.0.1:9000
или даже сохранить URL репо в pip.conf
чтобы не вводить его каждый раз:
# pip.conf
[global]
extra-index-url=http://127.0.0.1:9000
Справка: руководство пользователя по Python Packaging, размещение собственного простого репозитория
В зеркале нет ничего особенного, и вы можете использовать mod_rewrite
настроить это самостоятельно.
Дамп ваших пакетов в каталог, который сопоставлен с URL. Здесь я использую
/url/to/my/pypi/
пример. Иерархия папок должна быть/foo/bar/simple/[name of package]/[name of tarball]
Добавьте следующее к
.htaccess
или глобальная конфигурация для того каталога, в котором находятся ваши пакеты. Последний блок строк - это возврат к глобальному индексу pypi:Options +Indexes RewriteEngine On RewriteRule ^/robots.txt - [L] RewriteRule ^/icons/.* - [L] RewriteRule ^/index\..* - [L] RewriteCond /foo/bar/simple/ !-f RewriteCond /foo/bar/simple/ !-d RewriteRule ^/(.*)/?$ http://pypi.python.org/ [R,L]
Обновите свой
~/.pip/pip.conf
указать на новый репозиторий:[global] index-url = http://localhost/url/to/my/pypi/
Или используйте
-i http://localhost/url/to/my/pypi/
вариант в командной строке.
Если вы говорите о запуске simplepypi, то у вас будет свой сервер для добавления пакетов и их раздачи. Цитировать документацию:
- Running this on the setup.py of your favorite package: python setup.py sdist upload -r local
Если бы вы использовали os.walk
или же glob.glob
в вашем локальном каталоге site-packages вы можете быстро отфильтровать setup.py
в каждом из пакетов / каталогов и вызовите выше на них.
Если вам просто нужно создать каталог файлов tar.gz с полным списком их.html, то вы можете использовать glob.glob на верхнем уровне каталога вашего сайта-пакета - tar.gz поочередно каждый каталог и добавить полученный результат имя файла в список - вы можете создать свой index.html из этого списка.
Вы можете использовать любой из большого количества шаблонизаторов для этого или создать его самостоятельно:
import glob
filelist = glob.glob("*.tar.gz")
tags = ['<A href="file:Where/%s">%s</A>' % (s,s) for s in tags]
head = """<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<HTML>
<HEAD>
<TITLE></TITLE>
<META NAME="Generator" CONTENT="Python Script">
<META NAME="Keywords" CONTENT="Cheeseshop">
<META NAME="Description" CONTENT="List of local python packages">
</HEAD>
<BODY BGCOLOR="#FFFFFF" TEXT="#000000" LINK="#FF0000" VLINK="#800000" ALINK="#FF00FF" BACKGROUND="?">
"""
tail = """</BODY></HTML>"""
tags.insert(0,head)
tags.append(tail)
page = "\n".join(tags)
Затем сохраните или обслужите вашу страницу.