首页 > 解决方案 > 仅部署生成的代码,没有 composer.json 文件,并且在“src”目录中使用“vendor”

问题描述

我在项目的根目录中有一个包含所有composer.json,phpunit.xml等的项目。

所有的.php来源都在src/

我已将 composer.json 配置如下:

{
  "name" : "myproj",
  "config" : {
    "vendor-dir" : "src/vendor"
  },
  "autoload" : {
    "psr-4" : {
      "myclasses\\" : "src/classes"
    }
  }
}

这在我的开发机器上运行良好。

问题是我只想部署src目录的内容,这样我就不会在部署服务器上获取所有项目元数据。

不幸的是,自动加载器会寻找类/var/www/test/vendor/composer/../../../src/classes/而不是例如/var/www/test/vendor/composer/../../classes/

PHP 警告:include():无法打开 '/var/www/test/vendor/composer/../../../src/classes/myclasses/core/messages/MessageList.php' 以供包含(include_path=' .:/usr/share/php') 在 /var/www/test/vendor/composer/ClassLoader.php 第 444 行

我可以做一个聪明的配置吗?还是我被迫移动composer.json(我认为这是生产不需要的元数据)/src

标签: phpdeploymentcomposer-php

解决方案


它从未在运行时使用的 composer.json 文件。无论如何它没有用,它只被composer命令使用。如果您不在 composer生产机器上运行,则无需上传它。

您的项目并没有失败,因为“您没有使用代码部署 composer.json”,而是因为您正在转储具有特定结构的自动加载器,您实际上在配置中提到了该composer.json结构,然后尝试使用不同的目录结构运行服务器.

当您运行composer install并且composer dumpautoloader您的项目如下所示:

composer.json
src/ <--- this is where autoloader looks for your files.
--- yourCode/
--- moreCode/
--- vendor/
------ autoloader.php

但是然后在您的服务器上,您在您的服务器上

yourCode/
moreCode/
vendor/
--- autoload.php <--- this can't find the 'src' directory

解决方案不是上传目录的内容src而是上传src目录本身。

任何其他需要使用自动加载器的脚本和其余代码都应该包含在内/var/www/test/src/vendor/autoload.php,并且一切都可以正常工作。

如果你不想在src里面有一个目录test,那么你不应该在自动加载器生成期间拥有它。不要使您的开发和登台环境与您的生产环境不同。

您唯一的选择是在您的构建机器中执行:

  • composer install
  • 搬到composer.json_src
  • 更改composer.json因此键上声明的路径autoload不提及src
  • composer dumpautoload
  • 删除composer.json
  • 上传src内容。

它不能保证工作并且它是一个脆弱的解决方案,但问题是您试图以与工具设计背道而驰的方式使用该工具。


推荐阅读