我有一个使用Grunt自动执行构建任务的Web应用程序的项目。我正在使用SASS和Compass以及Composer来管理PHP依赖项。目前我有一个文件夹结构,如下所示:
-project
|-build
|-node_modules
|-src
| |-composer.json
|Gemfile
|Gruntfile.js
|package.json
这样,我对 Grunt 的所有依赖项都在 package.json 中配置并由 npm 管理,SASS 和 Compass 的依赖项在 Gemfile 中配置并由捆绑器管理,PHP 的依赖项在 composer.json 中配置并由 Composer 管理。Grunt 从 src 文件夹中复制文件以在构建过程中构建,以及从 SASS 生成/压缩 CSS 并缩小 js。
我想知道是否有更好的文件夹结构来处理这个问题,因为我更希望能够从项目根目录运行所有初始工作环境设置,而不必从 src 中运行作曲家。目前,我将其保留在src中以正确生成自动加载路径,否则它将项目根目录视为Web根目录。
更新:
对不接受和解释不充分表示歉意。为了帮助澄清以下是我composer.json
的内容,现在它已移至项目根目录,问题不在于供应商文件,而在于使用作曲家为项目文件创建自动加载器:
{
"config": {
"vendor-dir": "src/vendor"
},
"repositories": [
{
"type": "composer",
"url": "https://packages.zendframework.com/"
}
],
"require": {
"aws/aws-sdk-php": "2.4.*",
"zendframework/zend-json": "2.0.*"
},
"autoload": {
"psr-0": {"Project''": "src/include/"}
}
}
这会在 vendor/composer
内输出以下autoload_namespaces.php
文件
// autoload_namespaces.php @generated by Composer
$vendorDir = dirname(dirname(__FILE__));
$baseDir = dirname(dirname($vendorDir));
return array(
'Zend''Stdlib''' => array($vendorDir . '/zendframework/zend-stdlib'),
'Zend''Json''' => array($vendorDir . '/zendframework/zend-json'),
'Symfony''Component''EventDispatcher''' => array($vendorDir . '/symfony/event-dispatcher'),
'Guzzle''Tests' => array($vendorDir . '/guzzle/guzzle/tests'),
'Guzzle' => array($vendorDir . '/guzzle/guzzle/src'),
'Project''' => array($baseDir . '/src/include'),
'Aws' => array($vendorDir . '/aws/aws-sdk-php/src'),
);
让$vendorDir
通过双dirname
调用向上查找两个级别是可以的,但是$baseDir
现在指向高于src
的级别,现在显式硬编码到自动加载器中以进行Project
。我怀疑解决此问题的唯一方法是将composer.json
移回src
文件夹,或者编写构建脚本来重写此文件,这似乎很讨厌。还有其他选择吗?
你不应该被迫把 composer.json 放在项目根目录以外的任何地方,但你这样做的原因几乎没有解释。您是如何配置自动加载的?您可以简单地将src/
添加到自动加载路径中,并将作曲家上移一级 - 随后将路径更改为vendor/autoload.php
,使其比现在更深一个目录级别。
更新
根据新信息,您会在部署期间拆分项目,并将原始src
文件夹的内容复制/变形/移动到生成文件夹。
我建议在实时推送文件之前在最终构建文件夹上运行composer install
。这意味着您需要将composer.json
文件(最重要的是composer.lock
文件)复制到该构建文件夹中,并且出于对称性的原因,这些文件应该像您开始的那样驻留在src
中,然后也被复制。