【问题标题】:is it ok for Composer autoloader to have classes that from require-dev that don't exist?Composer 自动加载器可以拥有来自 require-dev 的不存在的类吗?
【发布时间】:2016-06-26 07:32:24
【问题描述】:

我在我的项目中为我自己的类使用 Composer 自动加载器。

我也在使用 PHPUnit,所以我的 composer.json 有这个:

"require-dev": { "phpunit/phpunit": ">=3.5" },

这意味着我的作曲家自动加载器文件支持 PHPUnit 类。当我想运行测试时,这对我来说非常有用。

到目前为止,我一直避免提交提及所有 PHPUnit 文件的自动加载器文件版本。然而,事实证明这在开发过程中相当痛苦,因为我不得不在两个版本的自动加载器文件之间切换。

只提交它们可以吗?

【问题讨论】:

    标签: composer-php


    【解决方案1】:

    在部署到生产的过程中,运行composer install --no-dev 将忽略任何require-dev 包。所以 PHPUnit 代码不会在那里。

    【讨论】:

    • 确实如此。但我的观点是自动加载文件有两种可能的版本:有 PHPUnit 和没有。我的问题是:提交包含对不存在的 PHPUnit 文件的引用的自动加载文件是否安全?
    • 你为什么要提交那些无论如何都会被创建的文件?仅当您还建议提交您拥有的包中的所有代码时,这才有意义。这对于某些部署场景可能是有意义的,但它不是通常的情况,因为冗余会受到版本控制。
    【解决方案2】:

    到目前为止,我一直避免提交自动加载器的版本 提到所有 PHPUnit 文件的文件。然而,这是 证明在发展过程中相当痛苦,因为我一直不得不切换 自动加载器文件的两个版本之间。

    只提交它们可以吗?

    如果我理解正确,那么您想将部分 (vendor/composer) 或完整的供应商文件夹提交到您的存储库,对吗?

    这会使开发团队中的每个人都变得复杂,因为 供应商文件夹中的覆盖,当他们使用 Composer 运行依赖项更新时(包括自动加载重新生成),以及由于可能的合并冲突,在拉取时。

    我的建议是:不要这样做!保持您的存储库没有供应商文件夹!

    提交composer.lock 并使用composer install

    当开发人员获取您的存储库时,它没有提供供应商文件夹 他要做的第一件事就是通过运行composer install 来获取依赖项。

    现在,为了确保团队中的每个开发人员都能获取完全相同版本的依赖项,您可以/应该提交 composer.lock 文件。 Composer 也会运行得更快一些,因为它可以跳过依赖解析和版本查找,因为信息已经在锁定文件中。


    更新

    虽然我专注于requirerequire-dev 来解决您的问题,但我忘了提到还有两个用于自动加载的部分autoload 有一个autoload-dev

    "autoload" : {
        "psr-4": {
            "Application\\": "src/"
        }
    },
    "autoload-dev": {
        "psr-4": {
            "Application\\Tests\\": "tests/"
        }
    },
    

    参考:https://getcomposer.org/doc/04-schema.md#autoload-dev

    【讨论】:

    • 我想提交自动加载器,因为我希望我的项目可以在没有 Composer 的情况下使用。唯一的依赖是 PHPUnit,它在 require-dev 中。
    • 好吧,你可以标记一个新版本,使用composer install --no-dev 获取生产依赖项,然后打包它(包括供应商依赖项),发布它,然后将它部署到“你的上下文”。 |对您的问题的简短回答“可以提交它们吗?”是:它会使开发变得复杂,但会起作用。
    • 嗯,我想提交它们的原因实际上是为了让开发更简单,至少对我来说是这样!目前,我一直不得不在带有生产自动加载器的 git 分支和带有开发自动加载器的分支之间切换。
    • 我已经更新了我的答案并添加了关于 autoload-dev 部分的注释,这也可能有助于解决这个问题。
    猜你喜欢
    • 2014-10-17
    • 1970-01-01
    • 2017-06-13
    • 2020-01-21
    • 2020-01-28
    • 2019-03-16
    • 2016-05-13
    • 2016-04-17
    • 2012-10-01
    相关资源
    最近更新 更多