【问题标题】:Which options do exist for defining a Python package with node.js dependencies?有哪些选项可用于定义具有 node.js 依赖项的 Python 包?
【发布时间】:2018-10-01 21:18:31
【问题描述】:

目前,我在本地使用了一些(未发布的)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 .

背景是我有很多node.js依赖,JavaScript CLI脚本,都是我的Python代码调用的。

当前方法的优点:

  • 很简单:依赖nodeenv 完成所有必需的管道
  • 理论上可以在setup.pysubprocess.Popen等内实现

当前方法的缺点:

  • 仅支持 Bash 的类 Unix 平台
  • “很难”分发我的包,比​​如在 PyPI 上
  • 需要虚拟环境
  • 如果全局安装软件包,可能会产生“有趣”的副作用
  • 可能会干扰当前虚拟环境中 nodeenv 的现有配置/“部署”

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

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


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

我创建了一个issue there asking a similar question


编辑(1):有趣的资源:@​​987654323@


编辑(2):我创建了一个issue against nodeenv,询问我如何使项目依赖它。

【问题讨论】:

  • 天哪,你为什么要这样对自己?
  • @LukeMlsna 有时我们别无选择,在以互操作性的名称(或名称)构建事物时。
  • @s-m-e 您正在使用什么 Python 中不存在的 Node 算法或功能?另外,你考虑过 Docker 吗?你可以只运送一个安装了 JS + Python 依赖项的容器......
  • @duhaime Docker 无疑是一种选择,但假设您的用户没有运行 Docker 容器的选项,那么它的重量并不轻或易于部署。
  • @LukeMlsna 我也在问自己同样的事情;)

标签: javascript python node.js npm python-packaging


【解决方案1】:

(免责声明:我是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 的依赖?原来这样的项目存在:nopy。我以前没用过,但粗略一看,它提供了一种在package.json 文件中记录依赖信息的特定方法,这是 Node.js 包传达有关自身信息的标准方法。请注意,它有一种管理 Python 包的非标准方式,但是鉴于它确实使用了任何可用的 Python,如果激活了 Python 虚拟环境,它可能会做正确的事情。这样做也意味着 Node.js 包依赖项可能有一种方法来找出由它们的 Node.js 依赖项声明的所需 Python 依赖项,但请注意,在它之上没有其他东西(或其他一些基础/行),无法从环境中断言它会保证做需要做的事情。

自然,回到 Python,这个问题之前已经被问过(但不一定是对你有用的方式,因为上下文都是不同的):

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

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

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

【讨论】:

  • 非常感谢您提供这个非常详尽的答案 :) 我花了一些时间来考虑它 - 你是对的,它实际上是多个单独的问题打包成一个。我想我需要把它分解成碎片。
  • 好吧,分解它也有一个不幸的结果,就是无法看到全局,因为它们都以有时愚蠢的方式相互关联。这是一个非常好的问题,imo。
  • @metatoaster 感谢您的宝贵回答,这对我也有帮助...
【解决方案2】:

你所描述的肯定不是最简单的问题。仅对于 Python,公司就想出了各种打包方法(例如 Twitter 的 pex、Spotify 的 dh-virtualenv,甚至是 grocker,将 Python 部署转移到容器空间)-(插件:我在 PyCon Balkan 做了一个演示'18 Packaging Python applications)。

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

  • 找到将 Node 应用程序编译为单个二进制文件的方法。有pkg(关于它的blogpost),其中

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

这样节点工具就会得到照顾。

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

优点:

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

缺点:

  • 您的 python 包将包含不太常见的二进制文件。
  • 包含二进制文件意味着您必须为所有平台准备版本。并非不可能,但还有更多工作要做。
  • 您必须稍微扩展您的包创建管道(Makefile、setup.py 或其他)以使其简单且可重复。
  • 您的包裹明显变大了(这可能是当今问题最少的一个)。

【讨论】:

  • nodeenv -p 实际上负责将预构建节点二进制文件拉入我的虚拟环境。对于某些用户来说,这可能是意外/不需要的,所以我想在运行它之前,我应该检查节点的预先安装,或者完全将此步骤留给“用户”。
猜你喜欢
  • 2018-12-17
  • 1970-01-01
  • 1970-01-01
  • 2021-11-28
  • 2013-10-06
  • 2016-07-29
  • 2014-11-15
  • 2011-02-24
  • 1970-01-01
相关资源
最近更新 更多