使用Grunt与npm,bundler和composer的Web应用程序的理想项目目录结构

时间:2013-11-13 15:59:41

标签: php bundler npm gruntjs composer-php

我已经为使用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文件夹,或者编写构建脚本来重写此文件,这看起来很讨厌。任何替代方案?

1 个答案:

答案 0 :(得分:0)

你不应该被迫将composer.json放在项目根目录以外的任何地方,但是你这样做的理由几乎没有解释。你是如何配置自动加载的?您只需将src/添加到自动加载路径并将编辑器向上移动一级 - 然后将路径更改为vendor/autoload.php,使其成为比现在更深的目录级别。

<强>更新

根据新信息,您可以在部署期间拆分项目,并将原始src文件夹的内容复制/变换/移动到构建文件夹。

我建议在推送文件之前在最终的构建文件夹上运行composer install。这意味着您需要将composer.json和最重要的composer.lock文件复制到该构建文件夹中,并且出于对称的原因,这些文件应该像您开始一样驻留在src内,然后还要复制