php - 仅部署生成的代码,没有 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
?
解决方案
它从未在运行时使用的 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
内容。
它不能保证工作并且它是一个脆弱的解决方案,但问题是您试图以与工具设计背道而驰的方式使用该工具。
推荐阅读
- asynchronous - 为什么 Future.timeout 在飞镖中不起作用?
- java - 将元素添加到向量列表
- sql - postgresql中的SQL Group By子查询
- python - 从列表中切出特定的
- solr - Solr DIH:Child Transformer 忽略的嵌套文档(不使用 json 端点忽略)
- r - R Shiny不读取文件路径
- c++ - CMake:如何强制 cmake 静态链接 openmp?
- f# - F# - 使用带有 out 参数的 C# 方法(在数组内和 void 返回)
- python - Python 类与实例变量
- php - 访问作为另一个对象(嵌套对象)属性的对象的最佳方法是什么?