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

时间:2016-08-10 17:53:49

标签: node.js npm dependencies package.json

我需要在package.json上指定{ engines: { "python": "2.7.11" } }版本。

我可以简单地做: <!DOCTYPE html> <html> <head> <style> canvas{ border:solid 5px #333; } </style> </head> <body> <button onclick="changeScale(0.10)">+</button> <button onclick="changeScale(-0.10)">-</button> <div id="container"> <canvas width="700" height="500" id ="canvas1"></canvas> </div> <script> var canvas = document.getElementById('canvas1'); var context = canvas.getContext("2d"); var imageDimensions ={width:0,height:0}; var photo = new Image(); var isDown = false; var startCoords = []; var last = [0, 0]; var windowWidth = canvas.width; var windowHeight = canvas.height; var scale=1; photo.addEventListener('load', eventPhotoLoaded , false); photo.src = "http://www.html5rocks.com/static/images/cors_server_flowchart.png"; function eventPhotoLoaded(e) { imageDimensions.width = photo.width; imageDimensions.height = photo.height; drawScreen(); } function changeScale(delta){ scale += delta; drawScreen(); } function drawScreen(){ context.fillRect(0,0, windowWidth, windowHeight); context.fillStyle="#333333"; context.drawImage(photo,0,0,imageDimensions.width*scale,imageDimensions.height*scale); } canvas.onmousedown = function(e) { isDown = true; startCoords = [ e.offsetX - last[0], e.offsetY - last[1] ]; }; canvas.onmouseup = function(e) { isDown = false; last = [ e.offsetX - startCoords[0], // set last coordinates e.offsetY - startCoords[1] ]; }; canvas.onmousemove = function(e) { if(!isDown) return; var x = e.offsetX; var y = e.offsetY; context.setTransform(1, 0, 0, 1, x - startCoords[0], y - startCoords[1]); drawScreen(); } </script> </body> </html>

2 个答案:

答案 0 :(得分:0)

"engines": { "python": "2.7.11" }放在您的package.json中不会引起任何问题(据我所知),但实际上也不会执行任何操作。

确定执行此操作的适当方法取决于项目的详细信息。如果与您编写的Python代码有关,则可以在Python脚本本身中检查版本。如果与package.json中的构建步骤有关,则可以在构建步骤中进行测试。

答案 1 :(得分:0)

从 NPM 7.x 开始(同样适用于旧版 NPM 6.x),"engines"package.json 字段的唯一有效条目是 "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.`);
  }
});