由于 Doctrine 似乎在其最新更新中完全删除了注释支持,因此我尝试使用 Rector 将实体中的注释转换为属性。
我遵循(看似)简单的官方教程- 我有完全相同的ector.php内容,没有NetteSetList:
use Rector\Doctrine\Set\DoctrineSetList;
use Rector\Symfony\Set\SymfonySetList;
use Rector\Symfony\Set\SensiolabsSetList;
use Rector\Config\RectorConfig;
return function (RectorConfig $rectorConfig): void {
$rectorConfig->sets([
DoctrineSetList::ANNOTATIONS_TO_ATTRIBUTES,
SymfonySetList::ANNOTATIONS_TO_ATTRIBUTES,
SensiolabsSetList::FRAMEWORK_EXTRA_61,
]);
};
Run Code Online (Sandbox Code Playgroud)
我用 运行测试vendor/bin/rector process src/Entity --dry-run --debug
。
它确实列出了 中的每个实体src/Entity
,但没有检测到任何可能的更改,此时它应该用属性替换每个学说注释。
运行简单的 Rector 规则时NormalizeNamespaceByPSR4ComposerAutoloadFileSystemRector
,源代码将完全格式化,用于美化源代码的换行符和空格将被删除。如何在 Rector 中避免这种情况?
$services->set(NormalizeNamespaceByPSR4ComposerAutoloadFileSystemRector::class);
... 是 rector.php 中唯一的服务配置。
Rector 说“![注意] File ...”将被添加:“所以根据规则它创建一个新文件(实际上它是同一个文件......)。我怀疑这对于 Rector 来说看起来很新,因为添加了命名空间规则。
我正在使用4.x 升级指南将站点从 CakePHP 3.10.0 升级到CakePHP 4.x。我已经成功了,直到您需要运行以下命令:
bin/cake upgrade rector --rules phpunit80 <path/to/app/tests>
bin/cake upgrade rector --rules cakephp40 <path/to/app/src>
Run Code Online (Sandbox Code Playgroud)
我跳过了第一个命令,因为我还没有进行单元测试!)。当我运行第二个命令时,它只是挂起。该命令根本没有任何输出。我已经让它静置了几个小时,但没有任何作用。我添加-v
到命令中并最终得到了一些输出,但它仍然挂起:
$ bin/cake upgrade rector --rules cakephp40 ../vintage-lib/src -v
Detecting autoload file for /mnt/d/Programming/PHP/vintage-lib/src
-> Checking /mnt/d/Programming/PHP/vintage-lib/src/vendor/autoload.php
-> Checking /mnt/d/Programming/PHP/vintage-lib/vendor/autoload.php
-> Found /mnt/d/Programming/PHP/vintage-lib/vendor/autoload.php
Running /mnt/d/Programming/PHP/upgrade/vendor/bin/rector process --autoload-file='/mnt/d/Programming/PHP/vintage-lib/vendor/autoload.php' --config='/mnt/d/Programming/PHP/upgrade/config/rector/cakephp40.php' --working-dir='/mnt/d/Programming/PHP/vintage-lib/src' '/mnt/d/Programming/PHP/vintage-lib/src'
Run Code Online (Sandbox Code Playgroud)
我尝试在 Windows、WSL 甚至 Linux VM 中运行它 - 结果保持不变,这让我相信它与我的代码或配置文件有关。我尝试在每个插件上运行该命令,但得到相同的结果。
我还运行并修复了来自 codeniffer 的所有错误和警告,但这没有什么区别。
我很茫然,因为我不知道下一步该去哪里检查。任何帮助将不胜感激。
我想使用 Rector 重构我的代码,因为我将项目更新为 symfony 5.4 到 6.1。我的php项目版本:8.1.5
所以,我想使用一个简单的规则,将我的注释更改为带有 ector 的属性。但是当我使用命令执行ector时:vendor/bin/rector process src
校长通知我:[OK]校长完成了!
但我的文件没有改变,我的实体注释也没有改变。我尝试按照此文档来配置我的rector.php并将rector与symfony一起使用。
https://github.com/rectorphp/rector-symfony
https://github.com/rectorphp/rector
我做错了什么?
这是我的rector.php
<?php
declare(strict_types=1);
use Rector\Config\RectorConfig;
use Rector\Php80\ValueObject\AnnotationToAttribute;
use Rector\Php80\Rector\Class_\AnnotationToAttributeRector;
use Rector\Symfony\Rector\MethodCall\StringFormTypeToClassRector;
use Rector\Symfony\Rector\Class_\CommandPropertyToAttributeRector;
return static function (RectorConfig $rectorConfig): void {
$rectorConfig->paths([
__DIR__ . '/src'
]);
$rectorConfig->phpstanConfig(__DIR__ . '/phpstan.neon');
$rectorConfig->symfonyContainerXml(__DIR__ . '/var/cache/dev/App_KernelDevDebugContainer.xml');
$rectorConfig->ruleWithConfiguration(
AnnotationToAttributeRector::class,
[new AnnotationToAttribute('Symfony\Routing\Annotation\Route')]
);
// register a single rule
//$rectorConfig->rule(CommandPropertyToAttributeRector::class);
// define sets of rules
/* $rectorConfig->sets([
SymfonySetList::SYMFONY_60,
SymfonySetList::SYMFONY_CODE_QUALITY,
SymfonySetList::SYMFONY_CONSTRUCTOR_INJECTION,
]);*/
};
Run Code Online (Sandbox Code Playgroud)
这是我的composer.json
{
"type": "project",
"license": "proprietary",
"minimum-stability": "dev",
"prefer-stable": …
Run Code Online (Sandbox Code Playgroud) 我有一个 PHP Symfony 项目,其中包含许多供应商和其他子目录文件,这些文件不应被 ector 触及。因此,我将路径变量设置为仅检查特定文件夹树中的文件。效果很好。
return static function (RectorConfig $rectorConfig): void {
$rectorConfig->paths([
__DIR__ . '/plugins/*',
]);
Run Code Online (Sandbox Code Playgroud)
但由于此文件夹包含可能有自己的供应商和测试目录的插件,因此我想跳过这些。关于文档https://github.com/rectorphp/rector/blob/main/docs/how_to_ignore_rule_or_paths.md使用通配符跳过是可能的,但这些跳过规则将被完全忽略。
return static function (RectorConfig $rectorConfig): void {
$rectorConfig->paths([
__DIR__ . '/plugins/*',
]);
$rectorConfig->skip([
__DIR__ . '/plugins/*/tests',
__DIR__ . '/plugins/*/vendor',
]);
Run Code Online (Sandbox Code Playgroud)
我的配置可能有什么问题?或者校长不允许结合这些选项?文档没有提供这样的情况。