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.
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. –
Guter Punkt. Ich werde das zur Frage hinzufügen. Danke für das Aufzeigen. – Dominik
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. –