如何检查生产中不需要开发依赖?

How to check that a dev dependency is not needed in production?

由于我们的项目需要一个库来 运行 测试,所以此包列在 composer.jsonrequire-dev 部分。

{
    //...
    "require": {
        "php": "^7.4|^8.0",
    },
    "require-dev": {
        "cache/array-adapter": "^1.1"
    },
    //...
}

在手动代码审查期间,我意识到这个库也在我们的生产代码中使用。

修复很简单,我们将相应的包从 require-dev 部分移到了 require 部分。

{
    //...
    "require": {
        "php": "^7.4|^8.0",
        "cache/array-adapter": "^1.1"
    },
    "require-dev": {
    },
    //...
}

我正在搜索自动 way/test 来避免此类问题。我想我们在staging时的手动测试可以避免这类问题,但这还不够。

如何检查我们的核心代码中不需要开发依赖?

您可以使用 PHPStan(或 Psalm,或任何其他静态分析器)实现此功能:如果您删除了开发依赖项,然后 运行 这样的工具,它会通知您缺少 类来自这样的依赖。

但请注意:即使这有助于编写更严格的代码,开始时也可能需要做一些工作才能在整个应用程序中实现正确的 return 类型


另一个想法:同时删除开发依赖项和 运行 像 PHPUnit 或 Behat 这样的常用测试套件。

我猜你可以用 deptrac 来完成。虽然它通常用于跟踪内部架构依赖性,但没有什么能阻止您配置它来跟踪外部依赖性。

这将需要您使用不同的“收集器”手动配置“开发”层,一个用于每个开发依赖项命名空间,一个基础层用于您的 App 命名空间。

App 中任何依赖于 dev 层的内容都是违规的,除非明确允许。您甚至可以将它放在 CI(这是 deptrac 的常见用例)中,任何违规都会停止部署。

配置应该是这样的(未经测试):

paths:
  - ./src/
exclude_files: ~
layers:
  - name: App
    collectors:
      - type: className
        regex: App\.*
  - name: Dependencies
    collectors:
      - type: className
        regex: Symfony\Bundle\MakerBundle\.*
      - type: className
        regex: Cache\Adapter\PHPArray\.*