存在哪些选项可用于定义具有Node.依赖项的 Python 包



目前,我有一些(未发布的)Python软件包在本地使用,我将它们(出于开发目的)与Linux上的Bash脚本安装到激活的(否则"空")虚拟环境中,方式如下:

cd /root/of/python/package
pip install -r requirements_python.txt # includes "nodeenv"
nodeenv -p # pulls node.js and integrates it into my virtual environment
npm i -g npm # update npm ...
cat requirements_node.txt | xargs npm install -g
pip install -e .

背景是我有许多节点.js依赖项,JavaScript CLI脚本,这些脚本由我的Python代码调用。

当前方法的优点:

  • 非常简单:依靠nodeenv进行所有必需的管道
  • 理论上可以在setup.py内与subprocess.Popen等一起实现

当前方法的缺点:

  • 仅使用 Bash 的类 Unix 平台
  • "很难"分发我的软件包,比如在 PyPI 上
  • 需要虚拟环境
  • 如果全局安装软件包,则具有潜在的"有趣"副作用
  • 可能会干扰当前虚拟环境中 nodeenv 的预先存在的配置/"部署">

什么是规范的(如果有的话)或只是一种理智的、潜在的跨平台方法,为 Python 包定义节点.js依赖项,使其可发布?

为什么这个问题甚至相关?JavaScript 不仅仅是为了 Web 开发(不再)。那里也有有趣的(相关)数据处理工具。如果你不想错过/忽略它们,那么,欢迎来到这种特殊形式的地狱。


最近遇到了calmjs,这似乎是我正在寻找的。我还没有对它进行太多实验,它似乎也是一个相对年轻的项目。

我在那里开始了一个问题,问了一个类似的问题。


编辑(1):有趣的资源:JavaScript与研究计算 - 对于那些后悔这已成为必要的人的简要指南


编辑(2):我开始针对nodeenv的问题,询问我如何使项目依赖于它。

(免责声明:我是calmjs的作者)

在又考虑了几天这个特定问题之后,这个问题实际上概括了多个问题,这些问题可能会也可能不会相互正交,具体取决于一个人的给定观点,给定以下一些(列表并不详尽)

  1. 开发人员如何确保他们拥有所有信息 在给定软件包时需要安装。
  2. 项目如何 确保他们所站立的地面是坚实的(即具有所有 所需的依赖项)。
  3. 用户安装给定项目的难易程度。
  4. 重现给定版本有多容易。

对于单一语言,单一平台的项目,提出的第一个问题很容易回答 - 只需使用为该语言实现的任何包管理解决方案(即Python - PyPI,Node.js - npm)。 其他问题通常都已到位。

对于多语言、多平台来说,这就是它完全分崩离析的地方。 长话短说,这就是为什么项目通常对任何版本的Windows,Mac或Linux(各种主流发行版)都有多套指令来安装他们的软件,尤其是二进制形式,以解决第三个问题,以便最终用户很容易(通常最终是可行的,但不一定容易)。

对于对问题 2 和 4 更感兴趣的开发人员和系统集成商,他们可能想要一个适用于他们所在平台的自动化脚本。 这是你已经得到的,除了它只适用于Linux,或者任何Bash可用的地方。 现在这也引出了一个问题:如何确保 Bash 在系统上可用? 一些系统管理员可能更喜欢其他形式的 shell,所以我们再次回到同样的问题,但与其问 Node.js 是否存在,不如问 Bash 是否存在。 所以这个问题基本上是无法解决的,除非画一条线。

第一个问题还没有真正被提及,我将通过以这种方式提问来使这个问题变得有趣:给定一个来自 npm 的包需要一个 Python 包,如何指定对 PyPI 的依赖关系? 事实证明,这样的项目存在:没有。 我以前没有用过它,但一眼看去它提供了一种在package.json文件中记录依赖信息的特定方法,这是 Node 的标准方法.js包传达有关自身的信息。 请注意,它有一种非标准的方式来管理Python包,但是鉴于它确实使用任何可用的Python,如果激活了Python虚拟环境,它可能会做正确的事情。 这样做也意味着 Node.js 包依赖项可能有办法找出由他们的 Node .js依赖项声明的所需 Python 依赖项,但请注意,如果没有其他东西在它之上(或其他一些接地/线路),就没有办法从环境中断言它将保证做需要做的事情。

当然,回到 Python,这个问题之前已经问过了(但不一定以有用的方式专门针对您,因为上下文都不同):

  • Python 项目中的 JavaScript 依赖项
  • 如何从python脚本安装npm包?
  • Django,推荐在块中声明和解决JavaScript依赖关系的方法
  • pip:对JavaScript库的依赖

无论如何,calmjs 只解决了问题 1 - 即让开发人员能够从给定的 Python 包中找出他们需要的 Node.js 包,并在较小程度上协助解决问题 4,但没有 2 和 3 的保证,它就不能完全解决。

从 Python 依赖管理的角度来看,在尝试使用之前,无法保证所需的外部工具可用(它要么有效,要么不起作用,同样来自 Node.js如前所述,顺便说一下,感谢您对问题跟踪器提出的问题)。 如果需要这种特殊的保证,许多系统集成商会使用他们最喜欢的操作系统级包管理器(即 dpkg/apt、rpm/yum 或 Linux 上的任何其他内容,OS X 上的 Homebrew,也许是 Windows 上的 Chocolatey),但这确实需要进一步的依赖项才能安装。 因此,如果要支持多个平台,则没有通用的解决方案,除非要缩小范围,或者具有某种标准的持续集成,该集成将生成工作安装映像,然后将其部署到组织使用的任何虚拟化服务上(只是一个示例)。

如果没有所有具体的基线,这个问题很难为有关各方提供令人满意的答案。

你所描述的当然不是最简单的问题。仅就Python而言,公司就提出了各种打包方法(例如Twitter的pex,Spotify的dh-virtualenv,甚至是grocker,它将Python部署转移到容器空间) - (插件:我在PyCon Balkan '18上做了一个关于打包Python应用程序的演讲)。

也就是说,我能想到的一种非常笨拙的方法就是:

  • 找到一种方法将 Node 应用程序编译为单个二进制文件。有pkg(关于它的博客文章),它

[...]使您能够将Node.js项目打包到可执行文件中,该可执行文件甚至可以在未安装Node.js的设备上运行。

这样节点工具就会得到处理。

  • 接下来,获取这些二进制 blob 并将它们(以某种方式)作为脚本添加到 python 包中,以便它们与您的包一起分发并找到它们的位置,实际的 python 包可以在其中拾取它们并执行它们。

优点:

  • 用户在他们的机器上不需要任何nodejs(这可能是意料之中的,当你只想pip install一些东西时)。
  • 通过包含二进制文件,您的包变得更加独立。

缺点:

  • 你的python包将包含二进制,这不太常见。
  • 包含二进制文件意味着您必须为所有平台准备版本。不是不可能,而是更多的工作。
  • 您必须稍微扩展您的包创建管道(Makefile、setup.py 或其他)才能使其简单且可重复。
  • 您的软件包会变得更大(这可能是当今最少的问题)。

相关内容

  • 没有找到相关文章

最新更新