使用带有 npm、捆绑器和作曲家的 Grunt 的 Web 应用程序的理想项目目录结构


Ideal project directory structure for web application using Grunt with npm, bundler and composer

我有一个使用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中,然后也被复制。