更改npm脚本的工作目录

106

问: 是否可以更改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 上不行。

原因: 问题的根源在于 Python 存储库的 configure 命令会将文件输出到调用命令所在的目录。但是这些文件对于 makemake install 构建过程非常重要,它们需要在存储库的目录中查找这些文件。

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

替代方案: 可能的替代方案是编写一些 install.js,并使用 Node 的跨平台 API 以及一些 child_process.exec()。我可能会这样做,但最好不离开 npm


1
我认为编写额外的脚本并从npm运行该脚本没有任何问题。 - webduvet
2
cd deps/2.7/cpython/ && ./configure еә”иҜҘеңЁ Windows дёҠеҸҜиЎҢ - жӮЁйҒҮеҲ°дәҶд»Җд№Ҳй—®йўҳпјҹ - Richard Williams
你不能使用./configure --prefix=$(pwd)/somepath。这不太好看。我还没有找到它,但是npm可能正在使用var spawn = require('child_process').spawn,这将允许您设置选项,如{cwd: pwd + 'somepath'},但未公开它。这也是一种哲学:软件包管理器具有与构建工具相同的许多功能。如果他们走这条路,他们需要像这样的某些功能。 - eljefedelrodeodeljefe
2
我用一个相当大的 install.js 解决了这个问题,它大致做了这个工作,并且像上面那样从 package.json 调用。不过,child_process 的 API 不是很容易处理,因为它会抛出许多难以调试的错误。花了我一些时间,但现在我很高兴。 - eljefedelrodeodeljefe
在这里编写了一个PR [https://github.com/npm/npm/issues/10957]。 - eljefedelrodeodeljefe
你能否按照这里的解决方案添加你的答案:https://github.com/npm/npm/pull/10958?这将有助于其他遇到相同问题的人。 - gnerkus
3个回答

125

npm仅允许执行 cd dir && command -args,此命令也可在Windows上运行。

已经有一个更改使用node的生成功能在PRhttps://github.com/npm/npm/pull/10958中提出,但由于上述解决方案而被拒绝。


2
不确定是否做了什么,但最近在Windows系统中出现了故障。 - user241244

7

如上所述:

npm 可能正在使用


注:本文涉及it技术相关内容。
var spawn = require('child_process').spawn

这将允许您设置选项,例如:
    {cwd: pwd + 'somepath'}

但不是披露它。

我通过一个相当大的install.js解决了这个问题,它大致做了这个工作,并像上面一样从package.json调用。然而,child_process的API并不容易处理,因为它会抛出很多难以调试的错误。花了一些时间,但现在我很高兴。


权限。不幸的是,正如我的回答所述,它已被拒绝合并。 - eljefedelrodeodeljefe
类似于:https://dev59.com/A2Mk5IYBdhLWcg3w3xrq,这对我也有效。 - yeahdixon
这就是为什么我们都开始使用 yarn 的原因。 - Tony O'Hagan

0

尝试

 const { execSync } = require('child_process');

 execSync(`cd ${your_working_directory} && npm install`) 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接