Mat
Aktives Mitglied
Betrifft die Implementierung von
Siehe auch mein Posting von vorhin: https://dev-community.de/threads/code-formatierung-für-die-c-und-c-foren.35/page-3#post-793
Vielleicht habt ihr ja Tipps oder Empfehlungen, wie man da am besten weitere Formatter einbauen könnte, ohne den Docker-Container unnötig aufzublasen.
Meine weiteren Versuche
IDE-Formatter missbrauchen
Eclipse und Jetbrains bringen eigene Bibliotheken oder Skripte mit, mit denen man per Kommandozeile Dateien formatieren kann. Zum Beispiel Java:
VS-Code hat Formatter wie Sand am Meer, und man kann auch per Terminal Extensions für weitere Formatter installieren. Allerdings scheint das Formatieren dann nur über die Befehlspalette in der GUI zu gehen. Dadurch wäre es sehr umständlich, damit etwas automatisch zu formatieren. Ich fand das aber etwas übertrieben, extra IDEs oder dicke Libraries zu installieren und auch keine Ahnung wie das lizenztechnisch aussehen würde.
PHPCS
Hatte für PHP auch noch kurz
Das lief so weit auch aber dann hab ich Prettier gesehen und das vorerst beiseite gelegt. Da kann man auf jeden Fall später drauf zurückkommen.
Prettier
Ansonsten war Prettier sehr vielversprechend und unterstützt viele Sprachen (und funktioniert auch überwiegend), aber ich war noch am überlegen, wie man das am schönsten einbauen könnte. Man braucht zur Ausführung nämlich nodejs, und dazu noch am Besten ein aktuelles (vielleicht gibt's noch eine Python-Alternative).
Aufbau
Die Sprachkonfiguration kann man wie bei clang in eine Datei reinstecken (ist nur ein Zwischenstand vom Herumprobieren) :
Da kann man auch direkt die verknüpften Dateierweiterungen hinterlegen und relativ feingranular Einstellungen vornehmen.
Per npm oder
Und dann nur noch einen Formatter bauen:
Probleme
Idee 1
NPM in der Dockerfile installieren (damit automatisch auch Node):
Da wird dann dann irgendein Gammel installiert (node 10 und npm 3 oder sowas.. und dann beschwert sich npm auch noch, dass node10 zu alt sei.. es müsse node 5,6,7 oder 8 her!! .. das parsed wohl nur die erste Stelle in der Version, aber das kennen wir ja von JS). Es lief dann auch, aber die anderen SprachPlugins waren nicht kompatibel damit. Man muss also eine custom repo für node hinterlegen und sich da die neue Version holen. Ich hatte es auch mit dem vorinstallierten snap-Paketmanager statt apt versucht, aber der hatte Netzwerkprobleme. apt kennt yarn nicht, und wenn doch, dann installiert es stattdessen cmdtest oder sowas. Kann man da nicht einfach eine Standalone binary von Node reinklatschen?
Wenn ein js-Interpreter sich als erforderlich und sinnvoll erweist, könnte man da sicher irgendwas platzsparendes hinkriegen. Aber bin da noch am überlegen.
Idee 2
Ich hatte daran gedacht, einen weiteren Container (zum Beispiel hat
Nodejs als Remote-Interpreter in einem extra-Container wäre schön, aber da müsste man dann ja eine Netzwerkpipeline zwischen den beiden Containern machen mit ssh oder einer Reverse-Shell.. dann kann man eigentlich auch genausogut nodejs im Hauptcontainer installieren.
Abschließend
In Hinblick auf ein mögliches zukünftiges Feature mit eigenen Codestyles (wie zum Beispiel Lano's Code ), ist es wahrscheinlich ganz gut so wenige unterschiedliche Codeformatter wie möglich zu haben, damit da nicht dutzende unterschiedliche APIs für die Formatierungseinstellungen geschrieben werden müssen. Deswegen sind da clang-format und prettier ganz gut. Allerdings scheint prettier leichter erweiterbar zu sein als clang.
Vielleicht kennt ihr ja noch einen gut erweiterbaren Formatter.. habe leider nur Prettier gefunden.
Ganz toll fänd ichs ja, wenn die Interpreter einfach selbst einen Formatter mitliefern würden (wie der von Go), aber am besten noch mit einer anpassbaren standardisierten Formatvorlage. Und der markiert und dann direkt im transformierten Code auch etwaige Syntaxfehler oder Warnungen (falls es kein isolierter Teilcode ist) .. man darf ja noch träumen
GitHub - dev-community-de/code-formatter: A simple web app to format code in XenForo forum posts
A simple web app to format code in XenForo forum posts - dev-community-de/code-formatter
github.com
Siehe auch mein Posting von vorhin: https://dev-community.de/threads/code-formatierung-für-die-c-und-c-foren.35/page-3#post-793
Vielleicht habt ihr ja Tipps oder Empfehlungen, wie man da am besten weitere Formatter einbauen könnte, ohne den Docker-Container unnötig aufzublasen.
Meine weiteren Versuche
IDE-Formatter missbrauchen
Eclipse und Jetbrains bringen eigene Bibliotheken oder Skripte mit, mit denen man per Kommandozeile Dateien formatieren kann. Zum Beispiel Java:
Format files from the command line | IntelliJ IDEA
www.jetbrains.com
PHPCS
Hatte für PHP auch noch kurz
phpcbf
getestet. Den kann man auch schön über composer
installieren und direkt aus dem Projektordner ausführen:GitHub - squizlabs/PHP_CodeSniffer: PHP_CodeSniffer tokenizes PHP files and detects violations of a defined set of coding standards.
PHP_CodeSniffer tokenizes PHP files and detects violations of a defined set of coding standards. - squizlabs/PHP_CodeSniffer
github.com
Prettier
What is Prettier? · Prettier
Prettier is an opinionated code formatter with support for:
prettier.io
Aufbau
Die Sprachkonfiguration kann man wie bei clang in eine Datei reinstecken (ist nur ein Zwischenstand vom Herumprobieren) :
Serviervorschlag .prettierrc:
# Specification: http://json.schemastore.org/prettierrc
# Documentation: https://prettier.io/docs/en/index.html
# Plugins
plugins:
- ./node_modules/@prettier/plugin-php
- ./node_modules/@prettier/plugin-ruby
- ./node_modules/@prettier/plugin-xml
- ./node_modules/prettier-plugin-java
- ./node_modules/prettier-plugin-kotlin
# General settings
useTabs: false # indent_style = space
tabWidth: 4 # indent_size = 4
printWidth: 120
singleQuote: false
trailingComma: none
endOfLine: lf # end_of_line = lf
semi: false
proseWrap: preserve
# Language specific settings
overrides:
# Stylesheet
- files: "*.css"
options:
parser: css
# HTML (without XML validation)
- files:
- "*.html"
- "*.html5"
options:
parser: html
htmlWhitespaceSensitivity: ignore
#
- files:
- "*.js"
- "*.javascript"
options:
parser: babel
trailingComma: es5
semi: true
- files:
- "*.json"
options:
parser: babel
trailingComma: es5
semi: true
- files:
- "*.md"
- "*.MD"
options:
parser: markdown
- files: "*.scss"
options:
parser: scss
- files:
- "*.ts"
- "*.typescript"
options:
parser: typescript
# Plugin Doc: https://github.com/prettier/plugin-php
- files:
- "*.php"
options:
parser: php
phpVersion: "7.3"
singleQuote: true
trailingCommaPHP: true
braceStyle: "psr-2"
# Plugin Doc: https://github.com/prettier/plugin-ruby
- files:
- "*.rb"
- "*.ruby"
options:
parser: ruby
- files:
- "*.html.vue"
- "*.vue"
options:
parser: vue
vueIndentScriptAndStyle: true
- files:
- "*.yaml"
- "*.yml"
options:
parser: yaml
singleQuote: false
tabWidth: 2
trailingComma: none # only applies when using []-arrays
- files:
- "*.xml"
options:
parser: xml
Da kann man auch direkt die verknüpften Dateierweiterungen hinterlegen und relativ feingranular Einstellungen vornehmen.
Per npm oder
yarn install
kann man das Zeug direkt aus der package.json installieren:
package.json:
{
"name": "code-formatter",
"description": "Manage JS dependencies to be used with the Code Formatter",
"version": "0.1.0",
"dependencies": {
"prettier": "^2.0.5",
"@prettier/plugin-php": "^0.14.2",
"@prettier/plugin-ruby": "^0.18.2",
"@prettier/plugin-xml": "^0.7.2",
"prettier-plugin-java": "^0.8.0",
"prettier-plugin-kotlin": "^2.0.0"
}
}
Und dann nur noch einen Formatter bauen:
PrettierCodeFormatter.php:
<?php
namespace DevCommunityDE\CodeFormatter\CodeFormatter;
/**
* Class ClangCodeFormatter
*
* @package DevCommunityDE\CodeFormatter\CodeFormatter
*/
class PrettierCodeFormatter extends CodeFormatter
{
/**
* @var array
*/
protected static $supported_languages = [
'css', // läuft
'html', // läuft
'javascript', // läuft
'json', // läuft
'less', // läuft
'markdown', // läuft, kümmert sich wohl nur um leere Zeilen
'scss', // läuft
'typescript', // läuft
'php', // läuft
'ruby',// läuft halb
'vue', // läuft
'yaml', // läuft, aber sehr empfindlich
'xml', // ToDo
];
/**
* Config taken automatically from <code>.prettierrc</code>
* @param string $file
* {@internal <code>--loglevel silent</code> does not override exit codes}
* @return string
*/
protected function getShellCommand(string $file) : string
{
return 'prettier --loglevel silent --write \'' . $file . '\'';
}
}
Probleme
Idee 1
NPM in der Dockerfile installieren (damit automatisch auch Node):
Dockerfile:
# Packages for formatting several languages with Prettier
RUN apt update -y && \
apt install -y npm git && \
npm install --global prettier
Da wird dann dann irgendein Gammel installiert (node 10 und npm 3 oder sowas.. und dann beschwert sich npm auch noch, dass node10 zu alt sei.. es müsse node 5,6,7 oder 8 her!! .. das parsed wohl nur die erste Stelle in der Version, aber das kennen wir ja von JS). Es lief dann auch, aber die anderen SprachPlugins waren nicht kompatibel damit. Man muss also eine custom repo für node hinterlegen und sich da die neue Version holen. Ich hatte es auch mit dem vorinstallierten snap-Paketmanager statt apt versucht, aber der hatte Netzwerkprobleme. apt kennt yarn nicht, und wenn doch, dann installiert es stattdessen cmdtest oder sowas. Kann man da nicht einfach eine Standalone binary von Node reinklatschen?
Wenn ein js-Interpreter sich als erforderlich und sinnvoll erweist, könnte man da sicher irgendwas platzsparendes hinkriegen. Aber bin da noch am überlegen.
Idee 2
Ich hatte daran gedacht, einen weiteren Container (zum Beispiel hat
node:14-slim
nur 50MB oder so, inklusive Yarn) laufen zu lassen mit Server, der vom Hauptcontainer per HTTP-Request um Codeformatierungen angebettelt werden könnte. Es gibt wohl auch einige container, die soetwas in der Art laufen haben (die sind leider schon einige Jahre alt). Aber man kann es auch mit den Microservices übertreiben Nodejs als Remote-Interpreter in einem extra-Container wäre schön, aber da müsste man dann ja eine Netzwerkpipeline zwischen den beiden Containern machen mit ssh oder einer Reverse-Shell.. dann kann man eigentlich auch genausogut nodejs im Hauptcontainer installieren.
Abschließend
In Hinblick auf ein mögliches zukünftiges Feature mit eigenen Codestyles (wie zum Beispiel Lano's Code ), ist es wahrscheinlich ganz gut so wenige unterschiedliche Codeformatter wie möglich zu haben, damit da nicht dutzende unterschiedliche APIs für die Formatierungseinstellungen geschrieben werden müssen. Deswegen sind da clang-format und prettier ganz gut. Allerdings scheint prettier leichter erweiterbar zu sein als clang.
Vielleicht kennt ihr ja noch einen gut erweiterbaren Formatter.. habe leider nur Prettier gefunden.
Ganz toll fänd ichs ja, wenn die Interpreter einfach selbst einen Formatter mitliefern würden (wie der von Go), aber am besten noch mit einer anpassbaren standardisierten Formatvorlage. Und der markiert und dann direkt im transformierten Code auch etwaige Syntaxfehler oder Warnungen (falls es kein isolierter Teilcode ist) .. man darf ja noch träumen
Zuletzt bearbeitet: