Cli: [FEATURE] Erlaube jsonc oder JSON5 für package.json zum Kommentieren

Erstellt am 10. Feb. 2020  ·  4Kommentare  ·  Quelle: npm/cli

Was warum

Beschreiben Sie die Anfrage im Detail

Im Guten wie im Schlechten ist der Inhalt innerhalb von package.json mit immer größerer Komplexität gewachsen. In den jungen Tagen von npm war die Datei einfach nur einige Metadaten zu den Abhängigkeiten, von denen ein Projekt/Paket abhing. Projekte wurden immer komplexer und jetzt sind Tests, Frameworks und andere Bibliotheken Abhängigkeiten, die scheinbar zusammensitzen. Es gab eine gewisse Trennung mit dependencies und devDependencies , aber das ist eine grobe Kategorisierung. Wir haben Tools, die jetzt mit größerer Komplexität in der package.json beitragen und sich darin niederlassen... Monorepo-Konfigurationen, Lint-Konfigurationen, Commit-Konfigurationen, Git-Hooks, Nodemon, Scherz, die Liste geht weiter...

Kommentare bieten eine Möglichkeit, die ganze Komplexität zu erklären.

Ich denke immer noch, dass Bibliotheksverwalter aus Gründen der Abwärtskompatibilität weiterhin reines JSON verwenden sollten, aber zumindest dies bietet Projektentwicklern (der überwiegenden Mehrheit der Benutzer) die Möglichkeit, ihr package.json zu dokumentieren. Zugegeben, json erlaubt doppelte Schlüssel als Kommentare, aber das fühlt sich zu sehr nach einem Hack an.

Wie

Aktuelles Verhalten

Ein redigiertes und erfundenes Beispiel:

{
  "name": "my-project",
  "version": "0.0.1",
  "license": "MIT",
  "scripts": {
    "build": "a bunch of scripts",
    "ci": "a bunch of scripts",
    "ci:local": "a bunch of scripts",
    "docsite": "a bunch of scripts",
    "docsite:combiner": "a bunch of scripts",
    "docsite:sassdoc": "a bunch of scripts",
    "docsite:tsdoc": "a bunch of scripts",
    "e2e": "a bunch of scripts",
    "html-sketchapp-install": "a bunch of scripts",
    "html-sketchapp": "a bunch of scripts",
    "lint": "a bunch of scripts",
    "sassdoc": "a bunch of scripts",
    "sassdoc:comp": "a bunch of scripts",
    "sassdoc:core": "a bunch of scripts",
    "start": "a bunch of scripts",
    "start:hmr": "a bunch of scripts",
    "start:qa": "a bunch of scripts",
    "start:dev": "a bunch of scripts",
    "generate-examples": "a bunch of scripts",
    "rebuild-markdown": "a bunch of scripts",
    "watch-examples": "a bunch of scripts",
    "test:cov": "a bunch of scripts",

    "test": "jest",
    "test:watch": "jest --watch",
    "test:cc": "jest --coverage"
  },
  "config": {
    "commitizen": {
      "path": "./node_modules/cz-conventional-changelog"
    }
  },
  "dependencies": {
    "@angular-devkit/build-angular": "~0.900.1",
    "@angular-devkit/build-ng-packagr": "~0.900.1",
    "@angular-devkit/core": "~9.0.0",
    "@angular-devkit/schematics": "~9.0.0",
    "@angular/animations": "~9.0.0",
    "@angular/cdk": "~9.0.0",
    "@angular/cli": "~9.0.1",
    "@angular/common": "~9.0.0",
    "@angular/compiler": "~9.0.0",
    "@angular/compiler-cli": "~9.0.0",
    "@angular/core": "~9.0.0",
    "@angular/forms": "~9.0.0",
    "@angular/language-service": "~9.0.0",
    "@angular/platform-browser": "~9.0.0",
    "@angular/platform-browser-dynamic": "~9.0.0",
    "@angular/router": "~9.0.0",
    "@angular/service-worker": "~9.0.0",
    "@angularclass/hmr": "2.1.3",
    "@ngrx/effects": "~8.6.0",
    "@ngrx/entity": "~8.6.0",
    "@ngrx/router-store": "~8.6.0",
    "@ngrx/schematics": "~8.6.0",
    "@ngrx/store": "~8.6.0",
    "@ngrx/store-devtools": "~8.6.0",
    "@types/jasmine": "~3.5.0",
    "@types/jasminewd2": "~2.0.3",
    "@types/lodash-es": "^4.17.3",
    "@types/node": "^12.11.1",
    "classlist.js": "1.1.20150312",
    "codelyzer": "^5.1.2",
    "console-polyfill": "0.3.0",
    "core-js": "^2.5.4",
    "cz-conventional-changelog": "1.2.0",
    "date-fns": "1.30.1",
    "highcharts": "^7.2.1",
    "highcharts-angular": "^2.4.0",
    "html2canvas": "^1.0.0-rc.5",
    "jasmine-core": "~3.5.0",
    "jasmine-spec-reporter": "~4.2.1",
    "karma": "~4.3.0",
    "karma-chrome-launcher": "~3.1.0",
    "karma-coverage-istanbul-reporter": "~2.1.0",
    "karma-jasmine": "~2.0.1",
    "karma-jasmine-html-reporter": "^1.4.2",
    "lodash-es": "^4.17.11",
    "mime": "~2.4.2",
    "ngrx-store-freeze": "0.2.4",
    "ngx-monaco-editor": "~8.0.0",
    "ngx-quill": "^7.3.12",
    "pdfmake": "^0.1.64",
    "prettier": "1.19.1",
    "protractor": "~5.4.3",
    "quill": "^1.3.7",
    "rxjs": "~6.5.4",
    "rxjs-compat": "^6.0.0",
    "standard-changelog": "1.0.19",
    "svgxuse": "1.2.6",
    "ts-node": "~8.3.0",
    "tsickle": "^0.35.0",
    "tslib": "^1.10.0",
    "tslint": "~5.18.0",
    "typescript": "~3.7.5",
    "web-animations-js": "~2.3.1",
    "zone.js": "~0.10.2"
  },
  "devDependencies": {
    "@types/jest": "^24.0.6",
    "jest": "^24.1.0",
    "jest-preset-angular": "^6.0.2",
    "ts-node": "~7.0.1",
    "typescript": "3.2.4"
  },
  "jest": {
    "preset": "jest-preset-angular",
    "setupTestFrameworkScriptFile": "<rootDir>/setupJest.ts"
  },
  "nodemonConfig": {
    "ignore": [
      "**/example-module.ts"
    ],
    "watch": [
      "./a/bunch/of/stuff"
    ],
    "ext": "js ts md html"
  },
  "workspaces": {
    "packages": [
      "packages/*"
    ],
    "nohoist": [
      "**"
    ]
  }
}

Erwartetes Verhalten

Ein Beispiel für eine package.json mit Kommentaren.

{
  "name": "my-project",
  "version": "0.0.1",
  "license": "MIT",
  "scripts": {
    "build": "a bunch of scripts",
    "ci": "a bunch of scripts",
    "ci:local": "a bunch of scripts",
    // for building our documentation site
    "docsite": "a bunch of scripts",
    "docsite:combiner": "a bunch of scripts",
    "docsite:sassdoc": "a bunch of scripts",
    "docsite:tsdoc": "a bunch of scripts",
    "e2e": "a bunch of scripts",
    "lint": "a bunch of scripts",
    "sassdoc": "a bunch of scripts",
    "sassdoc:comp": "a bunch of scripts",
    "sassdoc:core": "a bunch of scripts",
    "start": "a bunch of scripts",
    "start:hmr": "a bunch of scripts",
    "start:qa": "a bunch of scripts",
    "start:dev": "a bunch of scripts",
    "generate-examples": "a bunch of scripts",
    "rebuild-markdown": "a bunch of scripts",
    "watch-examples": "a bunch of scripts",
    "test:cov": "a bunch of scripts",

    "test": "jest",
    "test:watch": "jest --watch",
    "test:cc": "jest --coverage"
  },
  "config": {
    "commitizen": {
      "path": "./node_modules/cz-conventional-changelog"
    }
  },
  "dependencies": {
    // ANGULAR
    "@angular-devkit/build-angular": "~0.900.1",
    "@angular-devkit/build-ng-packagr": "~0.900.1",
    "@angular-devkit/core": "~9.0.0",
    "@angular-devkit/schematics": "~9.0.0",
    "@angular/animations": "~9.0.0",
    "@angular/cdk": "~9.0.0",
    "@angular/cli": "~9.0.1",
    "@angular/common": "~9.0.0",
    "@angular/compiler": "~9.0.0",
    "@angular/compiler-cli": "~9.0.0",
    "@angular/core": "~9.0.0",
    "@angular/forms": "~9.0.0",
    "@angular/language-service": "~9.0.0",
    "@angular/platform-browser": "~9.0.0",
    "@angular/platform-browser-dynamic": "~9.0.0",
    "@angular/router": "~9.0.0",
    "@angular/service-worker": "~9.0.0",
    "@angularclass/hmr": "2.1.3",

    "zone.js": "~0.10.2",
    "rxjs": "~6.5.4",
    "rxjs-compat": "^6.0.0",


    // polyfills for angular 
    "console-polyfill": "0.3.0",
    "core-js": "^2.5.4",
    "classlist.js": "1.1.20150312",
    "svgxuse": "1.2.6",
    "web-animations-js": "~2.3.1",

    // lint management

    "codelyzer": "^5.1.2",
    "prettier": "1.19.1",
    "tslint": "~5.18.0",

    // changelog creation
    "cz-conventional-changelog": "1.2.0",
    "standard-changelog": "1.0.19",

    // ngrx state management 
    "@ngrx/effects": "~8.6.0",
    "@ngrx/entity": "~8.6.0",
    "@ngrx/router-store": "~8.6.0",
    "@ngrx/schematics": "~8.6.0",
    "@ngrx/store": "~8.6.0",
    "@ngrx/store-devtools": "~8.6.0",
    "ngrx-store-freeze": "0.2.4",


    // library deps

    // Graphs support
    "highcharts": "^7.2.1",
    "highcharts-angular": "^2.4.0",

    // for creating pdfs
    "html2canvas": "^1.0.0-rc.5",
    "pdfmake": "^0.1.64",

    // rich text support
    "ngx-quill": "^7.3.12",
    "quill": "^1.3.7",




    // testing
    "jasmine-core": "~3.5.0",
    "jasmine-spec-reporter": "~4.2.1",
    "karma": "~4.3.0",
    "karma-chrome-launcher": "~3.1.0",
    "karma-coverage-istanbul-reporter": "~2.1.0",
    "karma-jasmine": "~2.0.1",
    "karma-jasmine-html-reporter": "^1.4.2",

    // e2e testing
    "protractor": "~5.4.3",

    // typscript and compilation
    "ts-node": "~8.3.0",
    "tsickle": "^0.35.0",
    "tslib": "^1.10.0",
    "typescript": "~3.7.5",

    // misc deps
    "date-fns": "1.30.1",
    "lodash-es": "^4.17.11",
    "mime": "~2.4.2"
  },
  "devDependencies": {
    "@types/jasmine": "~3.5.0",
    "@types/jasminewd2": "~2.0.3",
    "@types/lodash-es": "^4.17.3",
    "@types/node": "^12.11.1",
    "@types/jest": "^24.0.6",
    "jest": "^24.1.0",
    "jest-preset-angular": "^6.0.2",
    "ts-node": "~7.0.1",
    "typescript": "3.2.4"
  },
  // complicated jest configuration here
  "jest": {
    "preset": "jest-preset-angular",
    "setupTestFrameworkScriptFile": "<rootDir>/setupJest.ts"
  },
  // use nodemon to trigger stuff
  "nodemonConfig": {
    "ignore": [
      "**/example-module.ts"
    ],
    "watch": [
      "./a/bunch/of/stuff"
    ],
    "ext": "js ts md html"
  },
  // extra libraries we are creating internally
  "workspaces": {
    "packages": [
      "packages/*"
    ],
    "nohoist": [
      "**"
    ]
  }
}

Verweise

Beispiele * Bezogen auf #0 * Abhängig von #0 * Blockiert durch #0

https://github.com/microsoft/node-jsonc-parser

Typescript verwendet Kommentare in ihren tsconfig.json-Dateien.

Enhancement

Hilfreichster Kommentar

Jedes neue Feature ist per Definition abwärtskompatibel - ist das nicht normal und liegt in der Natur der Weiterentwicklung einer Software?

Abgesehen davon, dass es in anderen Projekten, die package.json laden, sehr leicht behoben werden kann, indem einfach das Paket hinzugefügt und JSON durch JSON5 die APIs identisch.

Babel hat vor einiger Zeit die JSON5-Unterstützung hinzugefügt und die Community geht einfach weiter und behebt diese kleinen Probleme, was überhaupt keine Zeit in Anspruch nimmt – und die Verbesserungen von JSON5 breiten sich einfach organisch auf andere Pakete aus, Dokumentationsverbesserungen breiten sich auf Projekte aus und so weiter.

Das scheint eine gute Sache zu sein.

IMO, fügen Sie nicht mehr Komplexität/Verwirrung hinzu, nur um eine Entschuldigung dafür zu liefern, nicht voranzukommen.

Alle 4 Kommentare

@admosity Leider wäre dies abwärtskompatibel :/ Außerdem würde es erfordern, dass alle andere Software, die package.json verwendet, sowie viele npm-Pakete die neue Syntax verstehen ...

das wäre abwärtskompatibel

Sie könnten zwei Dateien haben, um sie abwärtskompatibel zu halten:
Paket.json
Paket.json5

Der Benutzer würde einfach package.json5 bearbeiten, um die Kommentare hinzuzufügen. Npm könnte package.json erstellen (oder überschreiben) und die Kommentare von package.json5 einfach ignorieren.

Jedes neue Feature ist per Definition abwärtskompatibel - ist das nicht normal und liegt in der Natur der Weiterentwicklung einer Software?

Abgesehen davon, dass es in anderen Projekten, die package.json laden, sehr leicht behoben werden kann, indem einfach das Paket hinzugefügt und JSON durch JSON5 die APIs identisch.

Babel hat vor einiger Zeit die JSON5-Unterstützung hinzugefügt und die Community geht einfach weiter und behebt diese kleinen Probleme, was überhaupt keine Zeit in Anspruch nimmt – und die Verbesserungen von JSON5 breiten sich einfach organisch auf andere Pakete aus, Dokumentationsverbesserungen breiten sich auf Projekte aus und so weiter.

Das scheint eine gute Sache zu sein.

IMO, fügen Sie nicht mehr Komplexität/Verwirrung hinzu, nur um eine Entschuldigung dafür zu liefern, nicht voranzukommen.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen