【发布时间】:2016-12-17 05:58:51
【问题描述】:
我需要在我的package.json 上指定一个python 版本。
我可以简单地做:
{ engines: { "python": "2.7.11" } }?
【问题讨论】:
标签: node.js npm dependencies package.json
我需要在我的package.json 上指定一个python 版本。
我可以简单地做:
{ engines: { "python": "2.7.11" } }?
【问题讨论】:
标签: node.js npm dependencies package.json
在您的 package.json 中添加 "engines": { "python": "2.7.11" } 不会导致任何问题(据我所知),但它实际上也不会做任何事情。
确定执行此操作的适当方法取决于您的项目的具体情况。如果是关于您编写的 Python 代码,您可以检查 Python 脚本本身的版本。如果是关于package.json 中的构建步骤,您也许可以将测试作为构建步骤的一部分。
【讨论】:
从 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.`);
}
});
【讨论】: