2016-12-21 4 views
8

Also muss ich die package.json lesen, bevor ich ein neues Paket über npm installiere.Suchen Sie die Datei package.json in einem npm-Skript, das auf der Vorinstallation läuft.

Warum Paket.json in erster Linie lesen?

Ich benutze npm für CSS-Komponenten, die individuell versioniert sind und Abhängigkeiten haben können. (No javascript geliefert werden)

für eine Reihe von Abhängigkeiten für Versionskonflikte Suche ich erkennen müssen, wenn package A erfordert package [email protected] und package B erfordert package [email protected] und damit umgehen.

Npm (ab Version 3) befasst sich mit diesen Problemen, indem ein konfliktbehaftetes Modul tiefer in den Baum verschachtelt wird. Sie haben jetzt beide Versionen des gleichen Moduls. CSS hat einen globalen Namespace und ein Mixin (in Sasss Fall) würde sich dann gegenseitig überschreiben und Ihr CSS brechen.

Dieses flache Abhängigkeitsproblem ist perfekt im npm Blog skizziert: http://blog.npmjs.org/post/101775448305/npm-and-front-end-packaging

Auch nicht unseren spezifischen Anwendungsfall unter Berücksichtigung es mich seltsam fällt auf, dass Sie keinen Zugriff auf die package.json in preinstall und postinstall Skripten. Sie scheinen nur für diesen Anwendungsfall zu sein.

Was ich versucht

Mein package.json des Pakets Ich Installation sieht wie folgt aus:

{ 
    "name": "testmodule", 
    "version": "0.3.6", 
    "description": "TODO", 
    "scripts": { 
     "preinstall": "npm i some-script && some-script", 
    }, 
    "author": "TODO", 
    "license": "MIT" 
} 

Innerhalb dieses some-script Paket Ich betreibe:

console.log(process.cwd()); 
console.log(__dirname); 

ich dann laufen:

~/path/to/folder $ npm i testmodule 

Dies führt zu:

$ npm i testmodule 

> [email protected] preinstall /path/to/folder/node_modules/.staging/testmodule-5cc9d333 
> some-script 

/path/to/folder/node_modules/.staging/test-module-5cc9d333 
/path/to/folder/node_modules/.staging/test-module-5cc9d333/node_modules/some-script 

Nun, da ich total kann ich nicht wirklich die von Root-Zugriff, wo npm i läuft, weil mein Skript eine ganz andere Wurzel von einem subProzess von NPM und hat ausgeführt wurde.

Ich dachte, dann npm root sollte im Auge behalten, wo die eigentliche Wurzel für mich war, und übergeben, daß als Parameter an mein Skript aus dem Inneren der Testmodule package.json:

{ 
     "name": "testmodule", 
     "version": "0.3.6", 
     "description": "TODO", 
     "scripts": { 
       "preinstall": "npm i some-script && some-script \"$(npm root)\"", 
     }, 
     "author": "TODO", 
     "license": "MIT" 
} 

Leider auch, dass Standardwerte zurück zu einem Testpfad:

/path/to/folder/node_modules/.staging/testmodule-5cc9d333/node_modules 

I eingereicht an issue mit der Registrierung aber nicht für sie meine Hoffnungen halten zu, dass in der Zeit zu erhalten. Auch mein Skript muss auf älteren npm Installationen arbeiten.

In der Zwischenzeit kam ich mit so etwas in meinem some-script up:

let pgkPath = process.cwd().split('/node_modules/')[0]; 

Das wird /path/to/folder/ zurück, die korrekt ist, aber es macht die Annahme, niemand ein npm i in einem Ordner übrigens node_modules Namen läuft. .. Scheint hacky.

Frage

Wie kann ich den Pfad zum package.json Zugriff aus dem Inneren eines NPM-Skript, das über Preinstall ausgeführt wird? Das scheint mir etwas zu sein, das nicht allzu unerhört ist.

+1

Das klingt sehr ähnlich wie ein [XY Problem] (http://meta.stackexchange.com/a/66378) - was Sie versuchen, das zu tun, müssen Sie das 'package.json' lesen mit sein? Und nicht "Ich versuche Wert zu bekommen" ... "out", * warum * machst du das? Weil es eine gute Wette gibt, dass es einen besseren Weg gibt, zu tun, was Sie brauchen, von dem Sie einfach nichts wussten. –

+0

Guter Punkt. Ich werde das zur Frage hinzufügen. Danke für das Aufzeigen. – Dominik

+2

Alter, was? Das ist buchstäblich das, was NPM bereits für Sie tut, es ist eines der wichtigsten Dinge, die es tatsächlich tut, denn wenn Sie das per Hand erledigen müssten, wäre das ein hartnäckiges Problem. Auf welches arkane Beispiel der realen Welt ist es zurückzuführen, dass NPM die gleichzeitige Versionierung in der Abhängigkeitsstruktur nicht korrekt verwaltet? In dem Beispiel, das Sie geben, würde NPM eine Version nicht mit einer anderen überschreiben, es wird der Versionskonflikt angezeigt und beide Versionen befinden sich tiefer in der Struktur. –

Antwort

2

Ich verstehe nicht, Ihren Anwendungsfall ganz, aber Ihre Frage zu finden, einen Elternteil package.json von einem Preinstall-Skript zu beantworten:

Pass $(cd .. && npm prefix) als Argument für Ihr Skript, dann ./package.json laden.

npm prefix gibt das nächste übergeordnete Verzeichnis zurück, das eine package.json Datei enthält, die beim Aufruf aus dem Verzeichnis .. den Pfad des übergeordneten npm-Pakets zurückgeben soll.

{ 
     "name": "testmodule", 
     "version": "0.3.6", 
     "description": "TODO", 
     "scripts": { 
      "preinstall": "npm i some-script && some-script \"$(cd .. && npm prefix)\"", 
     }, 
     "author": "TODO", 
     "license": "MIT" 
} 
+0

sehr nett! Vielen Dank! – Dominik

Verwandte Themen