NPM - package.json#engines |如何指定 Python?

Posted

技术标签:

【中文标题】NPM - package.json#engines |如何指定 Python?【英文标题】:NPM - package.json#engines | How to specify Python? 【发布时间】:2016-12-17 05:58:51 【问题描述】:

我需要在我的package.json 上指定一个python 版本。

我可以简单地做: engines: "python": "2.7.11" ?

【问题讨论】:

【参考方案1】:

在您的 package.json 中添加 "engines": "python": "2.7.11" 不会导致任何问题(据我所知),但它实际上也不会做任何事情。

确定执行此操作的适当方法取决于您的项目的具体情况。如果是关于您编写​​的 Python 代码,您可以检查 Python 脚本本身的版本。如果是关于package.json 中的构建步骤,您也许可以将测试作为构建步骤的一部分。

【讨论】:

【参考方案2】:

从 NPM 7.x 开始(对于旧版 NPM 6.x 也有效),package.json 中的 "engines" 字段的唯一有效条目是 "node" 版本和 "npm" 版本。 此外,这不是一个约束,除非你也使用"engine-strict",如NPM docs所述:

除非用户设置了engine-strict 配置标志,否则此字段仅是建议​​性的,并且只会在您的包作为依赖项安装时产生警告。

您的要求(期待特定的python 版本)与环境要求的相关性比您的 Node/NPM 环境更重要。

您可以通过实现"postinstall" NPM 脚本来实现这一点,如果找不到所需的版本,可能会导致错误:

 
  "scripts": 
    "postinstall": "node ./check-python.js"
  

这个脚本会在npm install之后被NPM自动执行。您也可以改用“预安装”。 根据您的要求,考虑在您的“构建”或“预构建”脚本中使用它。在docs 中查看有关 NPM 前后脚本的更多详细信息。

那么,您的check-python.js 脚本可能类似于:

const  exec  = require('child_process');

const EXPECTED_PYTHON_VERSION = "2.7.11";

exec('python -c "import platform; print(platform.python_version())"',
     function(err, stdout, stderr) 
  const currentPythonVersion = stdout.toString();
  if(currentPythonVersion !== EXPECTED_PYTHON_VERSION)  
    throw new Error(`Expected Python version '$EXPECTED_PYTHON_VERSION' but found '$currentPythonVersion'. Please fix your Python installation.`);
  
);

【讨论】:

以上是关于NPM - package.json#engines |如何指定 Python?的主要内容,如果未能解决你的问题,请参考以下文章

如何将私有、自托管的 NPM 包与 Google App Engine 节点、标准环境一起使用

NPM5,package-lock.json 和 package.json 有啥区别?

npm 安装错误代码 128

npm中package.json详解

npm 与 package.json 快速入门教程

NodeJs开发之三: package.json和Package_lock.json