我是 Windows 用户,过去两年来一直成功运行 WSL2。我从事一个与 git 存储库相关的项目。所有开发人员都在 mac/linux 上工作,因此该项目的所有部分都针对这些类型的系统,包括预提交钩子之类的东西。
最近我决定尝试 Webstorm,所以我在 Windows 上安装了它,它还有一个可以安装到的 WSL 对应版本。一切都很顺利,直到我尝试将某些内容提交到存储库,这会调用一个预提交的 Husky 钩子,如下所示
#!/usr/bin/env node
const fs = require('fs');
const cp = require('child_process');
const { join } = require('path');
// ... then do some stuff in node/js
但是自从安装 Webstorm 我现在收到这个错误
.husky/commit-msg: 2: Syntax error: "(" unexpected
husky - commit-msg script failed (code 2)
我尝试了很多方法,已验证节点已安装并已进行符号链接,但从我的解释来看,尽管我使用 bash 终端来做所有事情,但也许它正在使用sh
?
例如我落入了这个页因为现在我在一个不相关的文件中也遇到了这个错误
Illegal option -o pipefail
该页面建议“使用 bash 而不是 sh”,我是,但似乎并非如此。
有什么想法吗?我可以查询/测试什么来查看我是否正在使用 bash 而不是 sh(即使我在 bash 终端中:S)
答案1
这与什么无关交互的您使用的 shell(即 bash 与 sh 1) - 事实上与 Ubuntu 或 WSL 无关。这似乎是 Husky 钩子机制本身的限制,如如何迁移部分husky v9.0.1 发行说明:
注意:
sh
即使设置了 shebang,也将用于运行钩子。
支持其他解释器是封闭功能请求的主题:
因此,如果您想从钩子运行节点脚本,则需要从 POSIX sh 兼容包装器中执行此操作。
如果你在 bash 中运行相同的节点脚本,你会得到类似的错误(尽管信息量略大一些)
.husky/commit-msg: line 2: syntax error near unexpected token `(' .husky/commit-msg: line 2: `const fs = require('fs');'
答案2
您可以使用多语言文件解决该问题:
#!/usr/bin/env node
// 2>/dev/null ; exec /usr/bin/env node "$0" "$@"
const fs = require('fs');
const cp = require('child_process');
const { join } = require('path');
// ... then do some stuff in node/js
该//
行被 node 忽略。在 bash 中,该//
部分会出错,但会被 静音2>/dev/null
。后面的部分;
作为下一个语句运行,这会打开正确的 Nodejs 解释器。当 Node 解析该部分时,它仍然在注释中,因此会被正确忽略。