2

我正试图围绕整个 PPA 事情展开思考,这似乎与每个人都认为的那样不必要地困难。让我们看一个像http://docs.bokeh.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://docs.bokeh.org/docs/dev_guide.html.

我就是这么做的!我错过了什么吗?对于直接来自 pypi 的东西来说,这座建筑甚至是必要的吗?指南掩盖了这些事情。

4

1 回答 1

1

是的,制作好的 deb 可能很复杂,尤其是当您不是上游作者并且不确定他们安装软件的确切意图时。复杂性是必要的,因为表现良好的 debs 必须符合相当长的政策要求列表以便用户知道在许多不同的情况和案例中对他们有什么期望。debs 的源代码需要包含足够的信息,以便可以由自动化系统构建(包括安装任何必要的构建依赖项)。二进制(内置)deb 必须将它们的文件放在系统上的正确位置,并且不会破坏任何其他包,并且能够在完全卸载后自行清理。Debs 应该可以在没有用户在交互式终端上观看的情况下安装。Debs 必须声明它们的所有依赖项,以及这些依赖项的必要版本,除了一些被认为是“必需”的包。在构建或安装期间,Debs 不应从 Internet 下载任何内容。等等等等。

另一方面,Python 源代码发行版(例如您在 PyPI 上找到的那些发行版)几乎可以为所欲为。出现了使用 构建和安装命令的最佳实践setup.py,但它们并不总是被遵循,即使它们被遵循,仍然有很大的解释和变化空间。有些,例如您在此处引用的那个,可能会任意要求用户setup.py在正常构建之前使用不同的非标准选项进行调用。有些人继续下载他们自己的依赖项并将它们放在他们想要的任何地方。除了琐碎之外,大多数软件包都不知道如何自行卸载。

这两种方法都很好,并且在不同的情况下更好。但是希望您现在可以明白为什么在一般情况下不可能将任意 Python 源代码分发自动生成到工作 deb 中。计算机必须对 Python 的行为方式做出太多假设。

说了这么多,如果您不关心是否符合 Ubuntu/Debian 政策,而只想将某些东西放在个人存储库中,那么对您来说最简单的方法可能是更改 Python 源代码,以便它执行--build_js必要时自动执行,而不是抱怨并要求用户这样做。

于 2014-12-11T22:12:31.510 回答