我正在使用ALE进行PHP开发。
可以将phpstan
用作linter之一,但是无论我做什么,都会有phpstan
无法加载类/方法定义的通知:
Function foo not found while trying to analyse it - autoloading is probably not configured properly.
不幸的是,ALE
的默认配置无济于事,因为它期望phpstan
位于$PATH
中,即使存在,它仍然会抱怨缺少自动加载功能。
答案 0 :(得分:0)
此解决方案特定于git
和composer
。
没有任何vcs或composer
,我找不到很好的解决方案。
因此,我们首先假定项目中使用了composer
,因此生成了autoload.php
文件。如果您不使用此功能,则可能应该使用,因为它将类映射到文件并使自动加载变得简单。
不幸的是,使用全局phpstan
二进制是徒劳的。这是因为phpstan
在当前目录中查找自动加载或霓虹灯配置文件,该文件告诉它在哪里查找类定义。因此,如果您不想被迫从根项目的目录中打开项目中的每个文件,那么应该有另一个解决方案。
使用phpstan
在项目(composer
中)中安装的vendor/bin/phpstan
二进制文件可以解决此问题。本地二进制文件使用相同的autoload.php
,并正确找到每个类定义。因此,我们需要告诉ale phpstan
二进制文件在哪里。
在以下行中插入vimrc
文件(或最好插入.vim/ftplugin/php.vim
):
let g:ale_php_phpstan_executable = system('if ! type git &> /dev/null; then echo phpstan; else PSE=`git rev-parse --show-toplevel 2> /dev/null`/vendor/bin/phpstan; if [ -x "$PSE" ]; then echo -n $PSE; else echo phpstan; fi; fi')
它告诉ALE phpstan
可执行文件的路径,该路径由运行shell comand确定。
if ! type git
部分检查系统中是否有git
命令。如果不是,则将默认的phpstan
文本返回给变量。
git rev-parse --show-toplevel
试图找出我们是否在git
资源库中,以及它是什么顶级目录。如果找到正确,它将通过将phpstan
添加到顶级目录来确定/vendor/bin/phpstan
的路径。这是本地安装的phpstan
所在的位置。
如果没有这样的文件或它不是可执行文件,那么将返回默认的phpstan
变量值。