Fügen Sie package.json benutzerdefinierte Metadaten oder Konfigurationen hinzu. Ist dies gültig?


78

Ich habe eine Datei package.json mit benutzerdefinierten Schlüsseln gesehen (weiß nicht mehr, wo), die mit einem Unterstrich beginnen:

{
    "name": "application-name"
  , "version": "0.0.1"
  , "private": true
  , "dependencies": {
      "express": "2.4.7"
    , "jade": ">= 0.0.1"
  }
  , "_random": true
}

Darfst du das machen? Ist es noch gültig? Wenn dies zulässig ist, gibt es eine Dokumentation zu den Regeln?

Vielen Dank!

Antworten:


106

tl; dr :

  • Ja, Sie dürfen benutzerdefinierte Einträge hinzufügen package.json.
  • Wählen Sie einen Schlüsselnamen:
    • noch nicht definiert (Details unten)
    • nicht für zukünftige Verwendung reserviert (Details unten)
    • Vermeiden Sie Präfixe _und$
    • Verwenden Sie vorzugsweise einen einzelnen Schlüssel der obersten Ebene, in den Sie Ihre benutzerdefinierten Einträge verschachteln können .

Wenn Sie beispielsweise eine Domain besitzen example.org, können Sie einen benutzerdefinierten randomSchlüssel wie folgt in einem Schlüssel der obersten Ebene in umgekehrter Domainnamen-Notation_.- speichern, der durch und gegebenenfalls ersetzt wird (siehe Kommentare) (z. B. org_example):

{
    "name": "application-name"
  , "version": "0.0.1"
  , "private": true
  , "dependencies": {
      "express": "2.4.7"
    , "jade": ">= 0.0.1"
  }  
  , "org_example": {
      "random": true
  }
}

npmDas package.jsonDateiformat entspricht größtenteils der CommonJS-Paketspezifikation :

Informationen zur Auswahl benutzerdefinierter Schlüssel : In der CommonJS-Paketspezifikation heißt es (Hervorhebung von mir):

Die folgenden Felder sind reserviert für zukünftige Expansion: build, default, email, external, files, imports, maintainer, paths, platform, require, summary, test, using, downloads, uid.

Erweiterungen der Paketdeskriptorspezifikation sollten darauf abzielen, Kollisionen für zukünftige Standardnamen zu vermeiden, indem ihre Eigenschaften mit harmlosen Namen versehen werden, deren Bedeutung für die allgemeine Paketverwaltung nicht relevant ist .

Die folgenden Felder sind für Paketregister reserviert, die nach eigenem Ermessen verwendet werden können: id, type. Alle Eigenschaften, die mit Paketregistern beginnen _oder diesen $vorbehalten sind, können nach eigenem Ermessen verwendet werden.


3
Danke für den Einblick. Gibt es einen Grund, den Sie "org_example"anstelle von "org.example"- oder einem XML-Namespace-ähnlichen empfehlen "http://example.org"?
Tomékwi

7
@tomekwi: Sie konnten verwenden org.exampleoder http://example.org, aber wenn man bedenkt, dass die JSON Schlüsselnamen sind auch Objekt Eigenschaftsnamen JavaScript, es wäre es schwierig zu machen , diese Eigenschaften später zugreifen, weil Sie etwas verwenden müssten wie pkg['org.example'], weil die natürlichere pkg.<propertyname>Syntax wouldn arbeite nicht mit ihnen.
mklement0

2
@tomekwi: Was @example: Ich nehme an, das würde funktionieren, wenn Sie den npm-Benutzernamen Ihrer / Ihrer Organisation verwenden. Beachten Sie, dass es sich hier auf jeden Fall um eine selbstgewählte Konvention handelt. Ich persönlich würde mich also für die Reverse-Domain-Notation entscheiden, da dies (a) in anderen Kontexten üblich ist und (b) "mehr" einzigartig "als ein npm Benutzername.
mklement0

1
@tomekwi: Ja, der eigentliche Sinn der Verwendung _ besteht darin, z. B. org_exampleals einzelnes Wort erkannt zu werden und einen regulären JS-Eigenschaftsnamen zu bilden . Sie beziehen sich auf -(Bindestrich-) Zeichen. in Domainnamen, die in der Tat nicht funktionieren würden. Sie können jedoch auch -Instanzen durch _Instanzen ersetzen . Dies macht die Transformation möglicherweise nicht umkehrbar , scheint mir jedoch Eigenschaftsnamen vorzuziehen http://domain-name.org, insbesondere angesichts der Tatsache, dass die Verwendung -in Domain-Namen immer seltener wird. Dies ist jedoch letztendlich eine Frage der Präferenz.
mklement0

1
Ich denke, das NPM-Team sollte dafür eine reservierte Immobilie auswählen. Wie "config" weiß ich nicht
GabrielBB

18

Angesichts der Natur von JSON und dieser Aussage aus der Nodejitsu-Dokumentation sehe ich daran nichts auszusetzen.

NPM selbst kennt nur zwei Felder in package.json:

{
   "name" : "barebones",
   "version" : "0.0.0",
}

NPM kümmert sich auch um einige der hier aufgeführten Felder . Solange es JSON gültig ist und Node.js oder NPM nicht beeinträchtigt, sollte alles in Ordnung und gültig sein.

Knoten das Bewusstsein der package.json Dateien scheint erstreckt sich auf das Hauptfeld. Ref.

 { "name" : "some-library",
   "main" : "./lib/some-library.js" }

Wenn sich dies in einem Ordner unter ./some-library befand, würde require ('./ some-library') versuchen, ./some-library/lib/some-library.js zu laden.

Dies ist das Ausmaß, in dem Node auf package.json-Dateien aufmerksam wird.

Um mögliche Konflikte zu vermeiden, sollten Sie Ihren Schlüsseln ein Zeichen oder ein Wort voranstellen. Ein Unterstrich ist eine häufige Variante.


4
Es kümmert sich um mehr Felder: P
Raynos

10
Im Nachhinein mehr als 2 Jahre: npm kümmert sich um viel mehr Felder (und knotet sich selbst um eine Teilmenge davon) - siehe npmjs.org/doc/files/package.json.html . NICHT _(oder $) für benutzerdefinierte Eigenschaften verwenden: "Alle Eigenschaften, die mit _ oder $ beginnen, sind auch für Paketregistrierungen reserviert, die nach eigenem Ermessen verwendet werden können." - wiki.commonjs.org/wiki/Packages/1.1 Weitere Informationen finden Sie in meiner Antwort .
mklement0

4
Ich empfehle wirklich, die aktuelle Antwort von @ mklement0 zu lesen .
Tomékwi
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.