为什么我需要通过 ssh 在 Homestead VM 中重新创建 composer autoloader?

Why I needed to recreate the composer autoloader inside the Homestead VM via ssh?

我的项目具有以下文件结构:

|- src
|-- PcMagas
|---- Dropbox.php
|---- DropBoxFactory.php
|- web
|-- index.php

并且 src 文件夹中的任何内容都会按照 PSR-4 的指示通过作曲家自动加载:

   "autoload": {
        "psr-4":{
            "": "src/"
        }
    }

位于 src/PCMagas 的 class 的样本是:

namespace PCMagas;

use \GuzzleHttp\Client; 
use PCMagas\Exceptions\FileNotFoundException;

class DropboxFactory
{
    public static function fomeFunc()
    {
       //Do stuff
    }
}

然后在 index.php 上,我使用 class 这样的:

require_once __DIR__ . '/../vendor/autoload.php';
use PCMagas\DropboxFactory;
DropboxFactory::fomeFunc();

虽然 Homestead 的 host 我通过以下方式启动我的应用程序:

composer dump-autoload -o
cd ^project_root^/web
php -S localhost:8990

命令的输出是:

$ composer dump-autoload -o

No composer.json in current directory, do you want to use the one at /home/pcmagas/Kwdikas/php/apps/datawise? [Y,n]? Y
Generating optimized autoload files

php -S localhost:8990 是:

PHP 7.0.33-0ubuntu0.16.04.3 Development Server started at Mon Apr 22 15:46:06 2019
Listening on http://localhost:8990
Document root is /home/pcmagas/Kwdikas/php/apps/datawise/web
Press Ctrl-C to quit.

没有任何问题。但是当我尝试通过 homestead 启动时,出现以下错误:

Fatal error: Uncaught Error: Class 'PCMagas\DropboxFactory' not found in /home/vagrant/code/web/index.php

通过做:

vagrant ssh

之后:

cd ~/code
composer dump-autoload -o

工作得很好,但我仍然有以下问题:

  1. 为什么在 host(Homestead-运行ning 虚拟机之外)classes 被自动加载而在内部却没有?是因为 ./vendor 文件夹是 .gitignored 吗?
  2. 如何在 Vm 设置中自动配置以自动加载 PSR-4 命名空间 classes? after.sh 运行 是根用户还是非根用户 vagrant 我的应用程序位于 /home/vagrant/code 中?

对于问题 2,您可以通过在项目的 after.sh 上放置以下代码来找出用户:

echo "I am user ${USER}"

和运行命令vagrant provision如果输出是:

I am user vagrant

然后 after.sh 中的以下代码应该可以完成这项工作:

cd ~/code
composer install
composer dump-autoload -o
cd

第一个我还没有答案给你