VSCODE和GitHub桌面版的预提交挂钩:npx命令未找到。

46

我正在创建一个新的代码仓库,考虑使用最新的 Husky v6,并按照他们的设置指南从 LintStaged 进行安装:

npx mrm lint-staged

// package.json updated with:
"husky": ">=6",
"lint-staged": ">=10",

这将添加必要的软件包并添加husky文件,包括precommit文件:

#!/bin/sh
. "$(dirname "$0")/_/husky.sh"

npx lint-staged

当我在终端中运行我的提交时,它能正常工作。但是,如果我尝试在GitHub桌面或VSCode中运行我的提交(我知道一些队友这样做),两者都会出现错误:

npx: 命令未找到。husky-预提交挂钩以127(错误)代码退出

我已经安装了npx:

npx -v
// 6.14.10

如果我尝试在全局范围内安装,就像其他StackOverflow建议中描述的那样,它会返回有关现有位置的警告(使用或不使用sudo):

ERR!EEXIST:文件已存在,符号链接'../lib/node_modules/npx/index.js' -> '/Users/plucks/.nvm/versions/node/v14.15.4/bin/npx' npm ERR!文件已存在:/Users/plucks/.nvm/versions/node/v14.15.4/bin/npx npm ERR!删除现有文件并重试,或运行npm npm ERR!使用--force以鲁莽地覆盖文件。

有什么办法可以让程序如VSCode和GitHub Desktop运行吗?


你找到解决方案了吗?我也遇到了同样的错误! - joe_inz
10个回答

79

3
与其希望用户找到解决方案,将其粘贴在您的回答中实际上会更有用。 :P - gkri
对我有用。请将其标记为答案。 - katerlouis
最好将此内容添加到.husky/pre-commit中,因为您可以通过git共享它。 - Apache
直到我找到了这个答案,才过了这么长时间。 - ddy250

27
在对你的项目进行任何修改之前,请尝试重新启动你的IDE,如此在这个问题中所提到的。 问题

2
我强烈建议其他人首先尝试这个。这对我很有用,省去了编写一堆Bash脚本或自定义配置的麻烦。 - Jeremy Bailey
1
是的,重启也解决了我的问题。一开始我用VS Code时它还能正常工作,但突然间就出问题了。我试过重新加载窗口,但没用。不过如果你重启IDE,问题就会解决。 - Alien128
1
这对我也起作用了 - Eliezer Steinbock
这个回复应该放在最前面!谢谢先生,我差点因为这个问题而发疯! - undefined
我在更新Xcode后,在macOS上使用GitHub Desktop遇到了这个问题,重新启动后问题也得到了解决。 - undefined
哈哈哈,这对我有用。谢谢。 - undefined

20

根据这个建议,将以下内容添加到您的pre-commit文件中应该可以解决问题:

export NVM_DIR="$HOME/.nvm/nvm.sh"
. "$(dirname $NVM_DIR)/nvm.sh"

export NVM_DIR="$HOME/.nvm"
a=$(nvm ls | grep 'node')
b=${a#*(-> }
v=${b%%[)| ]*}

export PATH="$NVM_DIR/versions/node/$v/bin:$PATH"

所以完整的文件看起来像这样:

#!/bin/sh
. "$(dirname "$0")/_/husky.sh"

export NVM_DIR="$HOME/.nvm/nvm.sh"
. "$(dirname $NVM_DIR)/nvm.sh"

export NVM_DIR="$HOME/.nvm"
a=$(nvm ls | grep 'node')
b=${a#*(-> }
v=${b%%[)| ]*}

export PATH="$NVM_DIR/versions/node/$v/bin:$PATH"

npm run test

2
谢谢!我正在运行Ubuntu,并将第一个文本块添加到~/.huskyrc中,解决了从GitHub桌面应用程序提交时的问题。 - Malachi Bazar
1
如果您不使用 nvm 呢? - Flion

16

对于husky>=6:请更新你的.husky/pre-commit文件,将其内容改为:

#!/bin/sh
. "$(dirname "$0")/_/husky.sh"

export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"

npx lint-staged

这将查找并公开当前节点路径,因此您正在使用配置了Node版本管理器nvmnpx路径。


7

我需要结合Cathal和Misol的答案。

出于两个原因,我不想像Cathal那样编辑.husky/pre-commit

  1. 我需要为每个使用husky的项目这样做
  2. 这实际上会影响我的Windows同事的husky使用

所以我添加了一个全局的~/.huskyrc文件,就像Misol一样,其内容如下:

export NVM_DIR="$HOME/.nvm/nvm.sh"
. "$(dirname $NVM_DIR)/nvm.sh"

export NVM_DIR="$HOME/.nvm"
a=$(nvm ls | grep 'node')
b=${a#*(-> }
v=${b%%[)| ]*}

export PATH="$NVM_DIR/versions/node/$v/bin:$PATH"

1
非常好用,非常棒。 - Vissie
这是我在VSCode和Github桌面版中都有效的唯一解决方案。 - Phil Lucks

1
如果你与其他可能使用不同方式安装nvm或node的人一起工作,我不建议在你的.husky/precommit~/.huskyrc文件中添加任何导出语句或编辑$PATH
如果你希望VSCode能够正确访问终端中期望的$PATH,你应该始终从所在文件夹的终端启动VSCode。
例如,在终端窗口中:
~/_git/my_project: code .

将使用以下命令在新窗口中启动VSCode,并打开my_project(它应该记住上次工作时的标签和窗口状态)。

现在,VSCode将使用终端从~/.zshrc~/.bashrc等文件中获取的$PATH

通过这种设置,我的.husky/precommit看起来像这样:

#!/bin/sh
. "$(dirname "$0")/_/husky.sh"

npx lint-staged

我的.lintstagedrc.json文件如下:

{
  "*.{js,jsx,ts,tsx}": [
    "eslint --fix --debug --max-warnings=-1",
    "npm run lint:prettier-fix"
  ],
  "*.{css,less,sass,scss}": ["npm run lint:prettier-fix"],
  "*.{g?(raph)ql,json,html,md,y?(a)ml}": ["npm run lint:prettier-fix"]
}

这个回答没有帮助。人们不会仅仅通过CLI从项目文件夹启动VSCode和Github Desktop。 - tshm001

1

对于那些使用fnm而不是nvm的人,将以下内容添加到~/.huskyrc中对我有用:

eval "$(fnm env)"

1

其他建议都很好,但如果你有两个 Node 版本,并且其中一个版本没有安装 yard,那么你将会遇到这个问题,所以需要进行简单的更改。

# ~/.huskyrc
# This loads nvm.sh and sets the correct PATH before running hook
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"

# This take the current active node version you want to verify the hook
export NVM_DIR="$HOME/.nvm"
a=$(nvm current)

export PATH="$NVM_DIR/versions/node/$a/bin:$PATH"

0
打开VSCode设置,将继承环境设置(终端 > 集成:继承环境)设为false:
"terminal.integrated.inheritEnv": false

此设置启用或禁用新 shell 是否应从 VS Code 继承其环境。


0

我按照顶部答案所说的更改了代码。但一开始它并没有起作用,后来重新打开了VScode才有效。

在终端中,我输入了以下命令:

  1. 复制此命令并在终端中粘贴并按回车键。

vi ~/.huskyrc

  1. 复制此命令并在终端中粘贴。

export NVM_DIR="$HOME/.nvm" [ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"

  1. 输入 :wq 退出编辑状态

  2. 重新打开VScode。


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