如何检查生产中不需要开发依赖?
How to check that a dev dependency is not needed in production?
由于我们的项目需要一个库来 运行 测试,所以此包列在 composer.json
的 require-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\.*
由于我们的项目需要一个库来 运行 测试,所以此包列在 composer.json
的 require-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\.*