我正在启动一个新的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
,原因有两个:
- 对于我在中使用的每个项目,我都需要这样做
- 它实际上会让我的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,它就起作用了。
在终端中,我输入以下命令:
- 在终端中复制此命令,然后按enter键
vi ~/.huskyrc
- 在终端中复制此命令
export NVM_DIR="$HOME/.nvm" [ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh"
-
输入
:wq
退出编辑状态 -
重新打开VScode。