我有一个package.json
文件,其中定义了以下脚本:
"scripts": {
"test": "./node_modules/selenium-cucumber-js/index.js"
}
当我在Linux或Mac上运行npm test
时,此脚本将按预期运行。在Windows上,但是出现错误:
/node_modules/selenium-cucumber-js/index.js
'.' is not recognized as an internal or external command,
operable program or batch file.
npm ERR! Test failed. See above for more details.
但是,如果我直接从cmd提示符下运行命令./node_modules/selenium-cucumber-js/index.js
,它将正常运行。如果我尝试通过以“。”开头的npm运行任何其他脚本,也会发生相同的问题。我再也找不到其他讨论此问题的话题了。
我正在Windows 10 Home上运行npm版本5.6.0
。
有人知道我该如何工作吗?
答案 0 :(得分:3)
在scripts
下定义的所有内容都将在默认系统终端和Windows ./node_modules/selenium-cucumber-js/index.js
上执行,这绝对不是有效的命令(或路径)。碰巧的是,同一个文件具有一个+x
参数和一个指向Node.js
(或另一个JS解释器)二进制文件的shebang,以便它可以在Linux上执行而无需干预。
我敢肯定,如果您在默认的Windows终端(cmd.exe
)中执行相同的命令,也会遇到相同的错误,但是您可能会在* nix的某些端口/仿真中忽略它终端(例如Cygwin,MSYS,bash.exe等),这可能会使您对npm
链之外的一切正常工作有错误的认识。
如果您要确保脚本在使用相对路径并保持跨平台兼容性的同时被Node.js
执行,请显式调用它:
"scripts": {
"test": "node ./node_modules/selenium-cucumber-js/index.js"
}
这还将解决诸如在执行的脚本中没有正确的x
标志或shebang之类的问题,并且由于Node.js
非常适合在Windows上使用* nix路径,因此不会”也不要抱怨。
答案 1 :(得分:1)
从npm 5.1开始
npm config set script-shell "C:\\Program Files (x86)\\git\\bin\\bash.exe"
或(64位安装)
npm config set script-shell "C:\\Program Files\\git\\bin\\bash.exe"
请注意,您需要拥有git for windows installed。
您可以通过运行以下命令还原它: npm config delete script-shell
答案 2 :(得分:0)
无论何时编写shell脚本,都需要指定为其编写的shell。对于内联package.json
脚本,应在.npmrc
旁边的package.json
中执行此操作,如下所示:
script-shell = bash
如果您未指定外壳,则npm
可以自由选择任何旧外壳。在Windows上,它选择cmd.exe
,这几乎是您想要的。
(注意:我不建议为此使用npm config set
。它设置本地用户配置。正确的shell应该与脚本一起存储在版本控制中。)