有哪些选项可用于定义具有node.js依赖关系的Python包?

s-m*_*m-e 9 javascript python node.js npm python-packaging

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

背景是我有许多node.js依赖项,JavaScript CLI脚本,我的Python代码调用它们.

当前方法的优点:

  • 死简单:依赖于nodeenv所有必需的管道
  • 理论上可以内实现setup.pysubprocess.Popen

当前方法的缺点:

  • 类似Unix的平台只有Bash
  • "很难"分发我的包,比​​如说PyPI
  • 需要一个虚拟环境
  • 如果全局安装包,则可能产生"有趣"的副作用
  • 可能会干扰当前虚拟环境中nodeenv的预先存在的配置/"部署"

什么是规范(如果有的话)或只是一个理智的,可能跨平台的方法来定义Python包的node.js依赖关系,使其可以发布?

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


我最近遇到了冷静,这似乎是我正在寻找的.我还没有尝试过它,它似乎也是一个相对年轻的项目.

我在那里问了一个类似的问题.


编辑(1):有趣的资源:JavaScript与研究计算 - 对于那些遗憾的必要的人的简要指南


编辑(2):我针对nodeenv启动了一个问题,询问我如何使项目依赖于它.

met*_*ter 7

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

在考虑了这个特定问题几天之后,这个问题实际上包含了多个问题,这些问题可能会或可能不会相互正交,这取决于一个人给定的观点,给出以下一些(列表并非详尽无遗)

  1. 开发人员如何确保他们拥有安装软件包所需的所有信息.
  2. 项目如何确保他们所站立的地面是可靠的(即具有所需的所有依赖性).
  3. 用户安装给定项目有多容易.
  4. 重现给定的构建是多么容易.

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

对于多语言,多平台,这是完全崩溃的地方.简而言之,这就是为什么项目通常会为任何版本的Windows,Mac或Linux(各种主流发行版)提供多套指令,用于安装他们的软件,特别是二进制形式,以解决第三个问题,这样很容易对于最终用户(通常最终可行,但不一定容易).

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

第一个问题还没有真正提到,我将以这种方式提出这个问题:给定一个需要Python包的npm包,如何指定对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,如前所述,并且谢谢你们顺便问一下你在问题跟踪器上的问题.如果需要这种特殊保证,许多系统集成商将使用他们喜欢的操作系统级别的包管理器(即dpkg/apt,rpm/yum或Linux上的其他任何东西,OS X上的Homebrew,也许是Windows上的Chocolatey),但是这确实需要进一步的依赖安装.因此,如果要支持多个平台,除非有人要缩小范围,或者进行某种标准的持续集成,然后生成工作安装映像,然后将其部署到组织使用的任何虚拟化服务上,就没有通用的解决方案(只是一个例子).

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


mik*_*iku 5

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

那就是说,一种非常黑客的方式,我能想到的是:

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

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

通过这种方式,Node工具可以处理.

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

上升空间:

  • 用户在他们的机器上不需要任何nodejs(这可能是你想要的pip install东西).
  • 通过包含二进制文件,您的包可以更加自包含.

缺点:

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

  • `nodeenv -p`实际上确实将预构建节点二进制文件拉入我的虚拟环境.对于某些用户来说,这可能是意外/不需要的,所以我想在运行它之前,我应该检查一个预先存在的节点安装,或者只是将这一步骤留给"用户". (2认同)