2

我已经为使用 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 中配置并由 Composer 管理。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$baseDirsrcProjectcomposer.jsonsrc

4

1 回答 1

0

您不应该被迫将 composer.json 放在项目根目录以外的任何地方,但您这样做的原因几乎没有解释。你是如何配置自动加载的?您可以简单地添加src/到自动加载路径并将作曲家上移一级 - 然后将路径更改为vendor/autoload.php比现在更深的目录级别。

更新

根据新信息,您确实在部署期间拆分了项目,并且原始src文件夹的内容被复制/变形/移动到构建文件夹。

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

于 2013-11-13T21:58:39.897 回答