95

问:是否可以更改 npm 运行脚本的上下文?

我想要的是以下内容:

"scripts": {
   "test": "gulp mocha",
   "pre-install": "./deps/2.7/cpython/configure --prefix=$(pwd)/build --exec-prefix=$(pwd)/build && make -C deps/2.7/cpython && make -C deps/2.7/cpython install",
   "install": "node-gyp rebuild"
},

显然cd deps/2.7/cpython/ && ./configure可以在类 UNIX 系统上工作,但不能在 Windows 上工作。

为什么:问题的根源在于,configurepython repo 的命令将文件输出到调用它的目录中。然而,这些文件与构建相关,make并且make install在 repo 的目录中查找文件。

在这种情况下,我无法更改,Makefile因为 Python 的构建过程非常复杂。

替代方案:替代方案可能是编写一些install.js并使用节点的操作系统独立 API 和 some child_process.exec(),我可能会这样做。但是,不离开npm真的很好。

4

2 回答 2

108

npm只允许做cd dir && command -args,这也将在 Windows 上运行。

在 PR https://github.com/npm/npm/pull/10958中对 usenode的 spawn 功能进行了更改,但由于上述解决方案而被拒绝。

于 2016-03-04T17:19:10.277 回答
7

如上所述:

npm 可能正在使用

var spawn = require('child_process').spawn

这将允许您设置以下选项:

    {cwd: pwd + 'somepath'}

但没有暴露它。

我已经用一个相当大的 解决了它install.js,它大致做到了这一点,它package.json像上面一样被调用。不过,API 的child_process处理并不容易,因为它会引发大量难以调试的错误。花了我一些时间,但我现在很开心。

于 2016-02-17T20:46:17.213 回答