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

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

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

【问题讨论】:

    标签: node.js npm dependencies package.json


    【解决方案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.`);
        }
      });
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-09-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-10-06
        • 2022-06-26
        • 1970-01-01
        相关资源
        最近更新 更多