VSCODE 和 GitHub Desktop 预提交钩子:npx:找不到命令



我正在启动一个新的repo,我认为我应该使用最新的Huksy v6,它是使用他们的设置指南从LintStaged安装的:

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

这添加了必要的包,并添加了包括预提交文件在内的husky文件:

#!/bin/sh
. "$(dirname "$0")/_/husky.sh"
npx lint-staged

当我在终端中运行提交时,它运行良好。然而,如果我试图在GitHub Desktop或VSCode中运行我的提交(我知道一些队友会这样做(,这会导致两者都出现错误:

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

我安装了npx:

npx -v
// 6.14.10

如果我尝试在globall中安装,如其他StackOverflow建议中所述,它会返回一个关于现有位置的警告(带有和不带sudo(:

ERR!EEXIST:文件已存在,符号链接".."/lib/nod_module/npx/index.js'->'/Users/pulks/.nvm/versions/node/v4.15.4/bin/npx'npm ERR!文件存在:/Users/pulks/.nvm/versions/node/v4.15.4/bin/npxnpm ERR!删除现有文件并重试,或者运行npmnpm ERR!with--force可以随意覆盖文件。

有什么我可以做的吗;GitHub桌面可以运行吗?

我从这里得到了解决方案。希望你也能找到它!

  • https://typicode.github.io/husky/#/?id=command-找不到
  • https://github.com/typicode/husky/issues/912

为了清晰起见,它在这里:

  • 如果尚未添加文件~/.huskyrc
  • 确保包括以下内容:
# ~/.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"

根据这个建议,在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

在向项目添加任何修改之前,请尝试重新启动本期中提到的IDE

对于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路径,因此您正在使用的npx路径,该路径已使用Node Version Managernvm配置

我不得不把Cathal和Misol的答案结合起来。

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

  1. 对于我在中使用的每个项目,我都需要这样做
  2. 它实际上会让我的Windows开发伙伴们大吃一惊

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

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"

如果您所在的团队中的其他人可能以与您略有不同的方式安装了nvm或节点,我不建议在您的.husky/precommit~/.huskyrc文件中添加任何导出语句或对$PATH的编辑。

如果您希望您的VSCode能够正确访问您期望从终端访问的$PATH,则应始终从您正在使用的文件夹中的终端启动VSCode。

例如,在终端窗口中:

~/_git/my_project: code .

将在新窗口中打开my_project的情况下启动VSCode(它应该记住您上次处理项目时的选项卡和窗口状态(。

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"]
}

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

eval "$(fnm env)"

在您只有一个节点版本之前,其他建议都很好。如果您有两个节点版本,而其中一个版本中没有纱线,您将面临此问题,所以做一个简单的改变

# ~/.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"

打开VSCode设置并将"继承环境"设置(终端>集成:继承环境(设置为false:

"terminal.integrated.inheritEnv": false

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

我按照上面的答案更改代码。但它一开始不起作用,然后重新打开VScode,它就起作用了。

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

  1. 在终端中复制此命令,然后按enter键

vi ~/.huskyrc

  1. 在终端中复制此命令

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

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

  2. 重新打开VScode。

最新更新