FriendsOfREDAXO/tricks

UPDATE Tricks > Development > VSCode 2/2

madiko opened this issue · 4 comments

Moin. Ergänzend zu meinem ersten Issue, den ich selbst lösen konnte, hier noch die offenen Punkte für die Profis 😉

https://github.com/FriendsOfREDAXO/tricks/blob/master/_docs/development/editor-vscode.md

Zeile 60
https://raw.githubusercontent.com/redaxo/redaxo/master/.php_cs.dist
Fehler: 404 not found

Und noch eine Frage: Gibt es einen Grund, dass in Zeile 254 der Fork von Natan Fourie (aka Natizyskunk) verwendet wird statt des Originals von
sFTP von Natizyskunk: sFTP von Natizyskunk
sFTP von liximomo: sFTP von liximomo

Eine Erklärung könnte sein, dass Natan deutlich aktueller ist und weniger offene issues hat.

Vielen Dank!

Ich notiere hier auch mal noch das Anliegen von @christophboecker von heute:

VSCode und PHP-CS-FIXER:
Wie kann ich rausfinden, welche Einstellungen der lädt bzw. ob er die REDAXO-Config geladen hat. Wenn ich die Doku richtig verstehe, suche er im .vscode-Verzeichnis z.B. nach .php-cs-fixer.php. Dort hab ich die Einstellungen liegen, aber die scheinen nicht zu greifen. Jemand nen Tip?

Nur um es schon mal geschrieben zu haben:

(iMac mit macOS, Apache/MySQL/PHP 7.4 installiert mittels Homebrew, PHP im Suchpfad der Console enthalten, VSCode 1.68 und php-cs-fixer-Extension von junstyle 0.2.12)

  • Der Beispielcode aus dem Trick
    `$finder = PhpCsFixer\Finder::create()
    ...
    return PhpCsFixer\Config::create()
    ...
    ist veraltet und führt mit dem aktuellen php-cs-fixer zu einem Abbruch. Man erhält die Instanzen nun über einen normalen Constructor
    $finder = (new \PhpCsFixer\Finder())
    ...
    return (new \PhpCsFixer\Config())
    ...
    Siehe PhpCsFixer-Issue auf der Github-Seite.
  • Die vermissten Einstellungen für Redaxo sind nun in einem eigenen Repository. Keine Ahnung, wie man das lokal elegant einbindet, aber man kann sich daraus die passende Datei einfach ableiten und ab und an aktualisieren. Etwas Feintuning ist aber nötig.
    // OrderedImportsFixer in den Rules benötigt den Pfad zum Namespace
    use PhpCsFixer\Fixer\Import\OrderedImportsFixer;
    
    $finder = (new PhpCsFixer\Finder())
      ->in(__DIR__)
    ;
    
    // aus https://github.com/redaxo/php-cs-fixer-config/blob/main/src/Config.php abgeleitet
    return (new PhpCsFixer\Config())
      // aus public function __construct
      ->setUsingCache(true)
      ->setRiskyAllowed(true)
      // aus private const REDAXO_RULES
      ->setRules([
          '@Symfony' => true,
          '@Symfony:risky' => true,
          '@PHP73Migration' => true,
          '@PHP71Migration:risky' => true,
          '@PHPUnit84Migration:risky' => true,
          'array_indentation' => true,
          'blank_line_before_statement' => false,
          'braces' => ['allow_single_line_closure' => false],
          'comment_to_phpdoc' => true,
          'concat_space' => false,
          'declare_strict_types' => false,
          'echo_tag_syntax' => false,
          'empty_loop_condition' => false,
          'global_namespace_import' => [
              'import_constants' => true,
              'import_functions' => true,
              'import_classes' => true,
          ],
          'heredoc_to_nowdoc' => true,
          'list_syntax' => ['syntax' => 'short'],
          'method_argument_space' => ['on_multiline' => 'ignore'],
          'native_constant_invocation' => false,
          'no_alternative_syntax' => false,
          'no_blank_lines_after_phpdoc' => false,
          'no_null_property_initialization' => true,
          'no_superfluous_elseif' => true,
          'no_unreachable_default_argument_value' => true,
          'no_useless_else' => true,
          'no_useless_return' => true,
          'ordered_class_elements' => ['order' => [
              'use_trait',
              'constant_public',
              'constant_protected',
              'constant_private',
              'property',
              'construct',
              'phpunit',
              'method',
          ]],
          'ordered_imports' => ['imports_order' => [
              OrderedImportsFixer::IMPORT_TYPE_CLASS,
              OrderedImportsFixer::IMPORT_TYPE_CONST,
              OrderedImportsFixer::IMPORT_TYPE_FUNCTION,
          ]],
          'php_unit_internal_class' => true,
          'php_unit_test_case_static_method_calls' => true,
          'phpdoc_align' => false,
          'phpdoc_no_package' => false,
          'phpdoc_order' => true,
          'phpdoc_separation' => false,
          'phpdoc_to_comment' => false,
          'phpdoc_types_order' => false,
          'phpdoc_var_annotation_correct_order' => true,
          'psr_autoloading' => false,
          'semicolon_after_instruction' => false,
          'static_lambda' => true,
          'void_return' => false,
      ])
      ->setFinder($finder)
    ;
  • Den Pfad zur PHP-Executable musste ich nicht einstellen, PHP wird automatisch gefunden. Das liegt wohl daran, dass PHP auf meinem System im Suchpfad der Shell enthalten ist. Achtung: CLI-Version von PHP in der Shell ist nicht automatisch auch die SAPI-Version im Webserver. (muss hier aber auch nicht)
  • Pfad zur Konfigurationsdatei in den Setting: da ist die Beschreibung etwas krude. Bei mit funktionierts es, wenn ich nur den Pfad der Konfigurationsdatei hinterlege und nicht durch ; getrennte Dateinamenvarianten und Pfade. Bei mir ist das der Pfad zum HTTP-Root, also "php-cs-fixer.config": "/Users/<<ich>/Sites/.php-cs-fixer.php". Klappt auch mit anderen Pfaden. Dazu muss man auch nicht die settings.json öffnen; die Einstellungsseite der Erweiterung ermöglicht die Eingabe im Abschnitt PHP-cs-fixer: Config.
  • Der offizielle Name der Config ist nun .php-cs-fixer.php, andere Namen sind veraltet, stand in einer Fehlermeldung in der VSCode-Konsole.
  • Hilfreich für die Fehlersuche: in VSCode die Konsole einschalten (Hife > Entwicklertools) und dort "Console". Das Ding sieht aus wie die Entwicklertools im Browser.
  • In der Konsole sieht man auch, ob die Extension überhaupt angezogen wurde und mit welchen Parametern (also auch den Namen der Config-Datei). Meldungen wie "Paths from configuration file have been overridden by paths provided as command arguments." hab ich ignoriert.

Noch ne Variante in Sachen php-cs-fixer. Damit kann man das Redaxo-Repository in der jeweils aktuellen Fassung einbinden, ohne jedes mal eine neue Konfig zusammenbauen zu müssen.

Auf macOS-Systemen hat es ein Verzeichnis ~/.vscode. Dort sind z.B. die installierten Extensions abgelegt. Hier könnte man die Konfiguration aus dem Repo für den Redaxo-php-cs-fixer ablegen.

Die Konfigurationsdatei im Repo (.php-cs-fixer.dist.php) benötigt eine per Autoloader bereitgestellte Klasse, die so leider nicht gefunden wird. Also muss man das System überlisten. Die Lösung: nicht die Konfigurationsdatei im Repo (.php-cs-fixer.dist.php) direkt verlinken, sondern eine Interface-Datei (.php-cs-fixer.php) zwischenschalten. Die Interface-Datei wird in der VSCode-Extension verlinkt und verbindet die nötigen Komponenten aus dem Repo:

include __DIR__.'/php-cs-fixer-config/src/Config.php';
return include (__DIR__.'/php-cs-fixer-config/.php-cs-fixer.dist.php');

Will man zusätzlich einzelne Einstellungen ändern, geht das so:

include __DIR__.'/php-cs-fixer-config/src/Config.php';
$config = include (__DIR__.'/php-cs-fixer-config/.php-cs-fixer.dist.php');
$rules = $config->getRules();
# rules al gusto verändern
$config->setRules($rules);
return $config

Bei Updates des Repos sollte es meist reichen, einfach das Repo auszutauschen.

Verzeichnisstruktur:

~/.vscode/
    .php-cs-fixer.php                    Die Interface-Datei
     php-cs-fixer-config/                Kopie des Redaxo-Repo bzw. des Releases
         .php-cs-fixer.dist.php          Die Original-Startdatei
         src/
             Config.php                  Notwendige eingebundene Klasse

Gefällt mir besser als der erste Vorschlag. Wie sähe denn auf einem Windosws-System das Equivalent zu ~/.vscode aus?

@Koala @christophboecker

Anhand von Christoph's letztem Vorschlag habe ich das jetzt mal auf Windows versucht.

Ich bin da aber auf Probleme gestossen.

https://github.com/kubawerlos/php-cs-fixer-custom-fixers musste ich noch zusätzlich herunterladen.
Auch den REDAXO-Fixer musste ich per require bekannt machen.

Die .php-cs-fixer.php sieht dann so aus

<?php

// Custom Fixer
require __DIR__ . '/php-cs-fixer-config/php-cs-fixer-custom-fixers/bootstrap.php';

// REDAXO Fixer
require __DIR__ . '/php-cs-fixer-config/src/Fixer/StatementIndentationFixer.php';

include __DIR__.'/php-cs-fixer-config/src/Config.php';
return include __DIR__.'/php-cs-fixer-config/.php-cs-fixer.dist.php';

Ich werde das dann evtl. morgen in einen PR packen.