我已经为使用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中配置并由bundler管理,PHP的依赖关系在composer.json中配置并管理作者:作曲家。 Grunt从src文件夹中复制文件以在构建期间构建,以及从SASS生成/压缩CSS并缩小js。
我想知道是否有更好的文件夹结构来处理这个,因为我更喜欢能够从项目根运行所有初始工作环境设置,而不必从src中运行composer。目前我将它保存在src中以便正确生成自动加载路径,否则它将项目根视为Web根目录。
更新
对不接受和解释不充分的道歉。为了帮助澄清下面我的composer.json
的内容,现在它已被移动到项目根目录,问题不在于供应商文件,而是使用composer为项目文件创建自动加载器:
{
"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/"}
}
}
在autoload_namespaces.php
vendor/composer
文件
// 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
文件夹,或者编写构建脚本来重写此文件,这看起来很讨厌。任何替代方案?
答案 0 :(得分:0)
你不应该被迫将composer.json放在项目根目录以外的任何地方,但是你这样做的理由几乎没有解释。你是如何配置自动加载的?您只需将src/
添加到自动加载路径并将编辑器向上移动一级 - 然后将路径更改为vendor/autoload.php
,使其成为比现在更深的目录级别。
<强>更新强>
根据新信息,您可以在部署期间拆分项目,并将原始src
文件夹的内容复制/变换/移动到构建文件夹。
我建议在推送文件之前在最终的构建文件夹上运行composer install
。这意味着您需要将composer.json
和最重要的composer.lock
文件复制到该构建文件夹中,并且出于对称的原因,这些文件应该像您开始一样驻留在src
内,然后还要复制