Подготовка сложного проекта на Python для отправки на панель запуска
Я пытаюсь обернуть голову вокруг всего этого PPA, и кажется, что это настолько излишне сложно, как это делают все. Давайте возьмем такой проект, как http://bokeh.pydata.org/ который имеет зависимость node.js, и сделаем из него.deb. Следуя этому руководству и различным постам здесь, я попытался использовать stdeb
сделать это:
pypi-download bokeh
tar xfz bokeh-0.7.0.tar.gz
cd bokeh-0.7.0/bokehjs/
npm install
grunt build
cd ..
python3 setup.py --command-packages=stdeb.command sdist_dsc
Конец вывода
dh clean --with python3 --buildsystem=python_distutils
dh_testdir -O--buildsystem=python_distutils
debian/rules override_dh_auto_clean
make[1]: Entering directory `/home/emre/Desktop/bokeh-0.7.0/deb_dist/bokeh-0.7.0'
python3 setup.py clean -a
/home/emre/Desktop/bokeh-0.7.0/deb_dist/bokeh-0.7.0/bokehjs
ERROR: Cannot install BokehJS: files missing in `./bokehjs/build`.
Please build BokehJS by running setup.py with the `--build_js` option.
Dev Guide: http://bokeh.pydata.org/docs/dev_guide.html#bokehjs.
Я только что сделал это! Я что-то пропустил? Является ли это здание необходимым даже для чего-то, что находится прямо у pypi? Направляющие затеняют эти вещи.
1 ответ
Создание хороших дэбов может быть сложным, да, особенно когда вы не являетесь автором основной ветки разработки и не знаете точно, каковы были их намерения для установки их программного обеспечения. Усложнение необходимо, потому что хорошо ведущие себя дебы должны соответствовать довольно длинному списку политик и требований, чтобы пользователи знали, чего ожидать от них во многих различных ситуациях и случаях. Источник для debs должен содержать достаточно информации, чтобы он мог быть собран автоматизированными системами (включая установку любых необходимых зависимостей сборки). Двоичные (встроенные) дэбы должны размещать свои файлы в нужных местах в системе, не нарушать другие пакеты и иметь возможность полностью очистить себя при удалении. Дебы должны быть установлены без просмотра пользователем интерактивного терминала. Debs должен объявить все свои зависимости и необходимые версии этих зависимостей, за исключением нескольких пакетов, которые считаются "обязательными". Дебс не должен ничего скачивать из интернета во время сборки или установки. И так далее, и так далее. Эта строгость и степень, которой придерживается сообщество, на самом деле являются одним из наиболее важных преимуществ запуска дистрибутива на основе Debian.
С другой стороны, дистрибутивы исходного кода Python, такие как те, что вы найдете в PyPI, могут делать все, что захотят. Появляются лучшие практики для команд сборки и установки с setup.py
, но они не всегда соблюдаются, и даже когда они есть, еще есть много возможностей для интерпретации и отклонений. Некоторые, например та, на которую вы ссылаетесь здесь, могут произвольно потребовать от пользователя вызова setup.py
с другой нестандартной опцией перед сборкой в обычном режиме. Некоторые идут дальше и загружают свои собственные зависимости и помещают их куда угодно. Большинство пакетов за тривиальным не знают, как удалить себя.
Оба подхода хороши и лучше в разных контекстах. Но, надеюсь, теперь вы понимаете, почему в общем случае невозможно автоматически сделать произвольные исходные дистрибутивы Python рабочими. Слишком много всего нужно предположить компьютеру о том, как поведет себя Python.
Сказав все это, если вы не заботитесь о соответствии политике Ubuntu/Debian и просто хотите иметь возможность поместить что-то в личный репозиторий, самым простым способом для вас может быть изменение исходного кода Python, чтобы он выполнял свои действия. --build_js
вещь автоматически по мере необходимости, вместо того, чтобы жаловаться и просить пользователя сделать это.