Ermitteln Sie den Projektstamm aus einer laufenden node.js-Anwendung
Gibt es einen besseren Weg, als process.cwd()
zu bestimmen, das root-Verzeichnis eines Laufenden node.js Prozess? So etwas wie das äquivalent von Rails.root
, aber für Node.js. Ich bin auf der Suche nach etwas, das so vorhersehbar und zuverlässig wie möglich.
Kommentar zu dem Problem
Jede chance, Sie könnten un-akzeptieren, der akzeptiert, falsche, Antwort?
versuchen Sie die
- Prozess.env.PWD
... siehe meine Antwort unten. InformationsquelleAutor der Frage MrEvil | 2012-04-22
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gibt es mehrere Möglichkeiten, dies zu nähern, die jeweils mit Ihren eigenen vor-und Nachteile:
erfordern.main.mit dem Namen
Vom http://nodejs.org/api/modules.html:
Wenn Sie So wollen, das base-Verzeichnis für die app, die Sie tun können:
Pros & Cons
Diese funktionieren auch Super, die meisten der Zeit, aber wenn Sie Ihre app mit einem launcher wie pm2 oder laufen Mokka tests, diese Methode scheitern wird.
global.X
Knoten verfügt über einen global namespace-Objekt namens
global
— alles, was Sie Anhängen, um das Objekt überall verfügbar sein wird in Ihrer app. Also, in Ihremindex.js
(oderapp.js
oder was auch immer Ihre Haupt-app-Datei benannt ist), können Sie einfach definieren Sie eine Globale variable:Pros & Cons
Konsequent arbeitet, aber Sie müssen verlassen sich auf eine Globale variable, was bedeutet, dass Sie nicht einfache Wiederverwendung von Komponenten/etc.
Prozess.cwd()
Diese gibt das aktuelle Arbeitsverzeichnis zurück. Nicht zuverlässig, da es völlig davon abhängig, in welchem Verzeichnis wurde der Prozess gestartet von:
app-root-Pfad
Um dieses Problem zu beheben, habe ich einen Knoten-Modul namens app-root-Pfad. Die Verwendung ist einfach:
Den app-root-Pfad Modul verwendet verschiedene Techniken, um zu bestimmen, den root-Pfad der Anwendung an, unter Berücksichtigung der weltweit installierten Module (zum Beispiel, wenn Ihre app ausgeführt wird, in
/var/www/
aber das Modul ist installiert in~/.nvm/v0.x.x/lib/node/
). Es funktioniert nicht 100% der Zeit, aber es funktioniert in den meisten gängigen Szenarien.Pros & Cons
Funktioniert ohne Konfiguration in den meisten Fällen. Bietet auch einige nette zusätzliche bequeme Methoden (siehe Projektseite). Die größte con ist, dass es nicht funktionieren, wenn:
node_modules
Verzeichnis (zum Beispiel, wenn Sie es installiert weltweit)Können Sie dies umgehen, indem Sie entweder die Einstellung ein
APP_ROOT_PATH
Umwelt-Variablen, oder durch den Aufruf.setPath()
auf dem Modul, aber in diesem Fall, sind Sie wahrscheinlich besser dran mit derglobal
Methode.NODE_PATH Umgebungsvariable
Wenn Sie auf der Suche nach einem Weg, um bestimmen den root-Pfad des aktuellen app, eine der oben genannten Lösungen ist wahrscheinlich am besten für Sie arbeiten. Wenn auf der anderen Seite, die Sie versuchen zu lösen das problem der be-app-Module zuverlässig, empfehle ich den Blick in die
NODE_PATH
Umwelt-Variablen.Knoten Module system sieht für die Module in einer Vielzahl von Standorten. Einer dieser Orte ist, wo
- Prozess.env.NODE_PATH
Punkte. Wenn Sie diese Umgebungsvariable, dann können Sierequire
- Module mit den standard-Modul-Lader ohne andere änderungen.Zum Beispiel, wenn Sie
NODE_PATH
zu/var/www/lib
, die die folgenden funktionieren würde just fine:Ein guter Weg, dies zu tun ist mit
npm
:Nun können Sie Ihre app mit
npm start
, und Sie sind golden. Ich Verbinde dies mit meinem durchsetzen-Knoten-Pfad Modul, welches verhindert, dass versehentlich das laden der app ohneNODE_PATH
gesetzt. Für noch mehr Kontrolle über die Durchsetzung von Umwelt-Variablen, siehe checkenv.Eine gotcha:
NODE_PATH
muss eingestellt werden außerhalb der Knoten-app. Können Sie nicht etwas tun, wieprocess.env.NODE_PATH = path.resolve(__dirname)
da das Modul loader speichert die Liste der Verzeichnisse, die Sie suchen werden, bevor Sie Ihre app ausgeführt wird.[Hinzugefügt 4/6/16] eine wirklich vielversprechende Modul, das versucht dieses problem zu lösen ist wellig.
InformationsquelleAutor der Antwort inxilpro
__dirname
ist nicht global; es ist lokal zu dem aktuellen Modul, damit jede Datei hat Ihre eigenen, lokalen, anderen Wert.Wenn Sie möchten, dass das root-Verzeichnis des Laufenden Prozesses, werden Sie wahrscheinlich tun möchten, verwenden Sie
process.cwd()
.Wenn Sie wollen Berechenbarkeit und Zuverlässigkeit, dann brauchen Sie wahrscheinlich, um es der Anforderung Ihrer Anwendung, die eine bestimmte Umgebungsvariable gesetzt ist. Ihre app sieht für
MY_APP_HOME
(Oder was auch immer) und wenn es da ist, und die Anwendung in diesem Verzeichnis existiert, dann ist alles gut. Wenn es nicht definiert ist oder in dem Verzeichnis nicht enthalten, Ihre Anwendung sollte es dann mit einem Fehler beenden der Benutzer aufgefordert wird, um die variable zu erstellen. Es könnte festgelegt werden, als ein Teil der Installation-Prozess.Können Sie Lesen von environment-Variablen in den Knoten mit etwas wie
process.env.MY_ENV_VARIABLE
.InformationsquelleAutor der Antwort izb
1 - erstellen Sie eine Datei im Projekt root nennen es settings.js
2 - in dieser Datei fügen Sie diesen code
3 - innen node_modules erstellen Sie ein neues Modul mit dem Namen "Einstellungen" und im Modul index.js schreiben Sie diesen code:
4 - und jedes mal, wenn Sie wollen, dass Ihr Projekt-Verzeichnis verwenden Sie einfach
in dieser Weise haben Sie alle Projekt-Verzeichnisse relativ zu dieser Datei 😉
InformationsquelleAutor der Antwort Fareed Alnamrouti
der einfachste Weg, um das Globale root (angenommen, Sie verwenden zum ausführen von NPM node.js app "npm start", etc)
Wenn Sie wollen cross-überprüfen Sie die oben
Sagen, Sie wollen cross-check
process.env.PWD
mit den Einstellungen, die Sie node.js -Anwendung. wenn Sie möchten, einige Laufzeit-tests zur überprüfung der Gültigkeit vonprocess.env.PWD
Sie können cross-check es mit diesem code (von der ich schrieb, das scheint gut zu funktionieren). Sie können cross-check, den Namen des letzten Ordners im appRoot mit der npm_package_name in Ihrem Paket.json-Datei, zum Beispiel:können Sie auch diese NPM-Modul:
require('app-root-path')
die funktioniert sehr gut für diesen ZweckInformationsquelleAutor der Antwort Alexander Mills
All diese "root-dirs" meist lösen müssen einige virtuelle Pfad zu einer echten Haufen Weg, so kann Sie sich am
path.resolve
?InformationsquelleAutor der Antwort Konstantin Isaev
Ich habe festgestellt, das funktioniert für mich konsequent, auch wenn die Anwendung aus aufgerufen wird, einen sub-Ordner, wie es sein kann, mit einigen test frameworks wie Mocha:
Warum es funktioniert:
Zur Laufzeit Knoten erstellt eine Registrierung von der vollständigen Pfade aller geladenen Dateien. Die Module werden erst geladen, und damit an der Spitze dieser Registrierung. Indem Sie das erste element der Registrierung und Rücksendung der Pfad vor dem 'node_modules' - Verzeichnis sind wir in der Lage, um zu bestimmen, die root der Anwendung.
Es ist nur eine Zeile code, aber der Einfachheit halber (mein Willen), ich black Box in eine NPM-Modul:
https://www.npmjs.com/package/node-root.pddivine
Genießen!
InformationsquelleAutor der Antwort Patrick
Vielleicht können Sie versuchen, durchqueren von unten nach oben
__filename
bis Sie einepackage.json
, und entscheiden, ist das Haupt-Verzeichnis der aktuellen Datei gehört.InformationsquelleAutor der Antwort kvz
Eigentlich finde ich die vielleicht triviale Lösung auch die meisten robust:
Sie legen Sie einfach die folgende Datei in das root-Verzeichnis des Projekts: root-path.js die hat folgenden code:
import * as path from 'path'
const projectRootPath = path.resolve(__dirname)
export const rootPath = projectRootPath
InformationsquelleAutor der Antwort Avi Tshuva
Einer Technik, die ich gefunden habe, nützlich bei der Verwendung von express ist, fügen Sie die folgenden app.js bevor weitere Routen gesetzt sind
Nicht zu benutzen brauchen globals und Sie haben den Pfad des root-Verzeichnis als eine Eigenschaft des request-Objekts.
Dies funktioniert, wenn Ihr app.js ist in der Wurzel des Projekts ist es standardmäßig.
InformationsquelleAutor der Antwort Ben Davies
Ich diese.
Für mein Modul mit dem Namen
mymodule
var BASE_DIR = __dirname.replace(/^(.*\/mymodule)(.*)$/, '$1')
InformationsquelleAutor der Antwort vbranden
Erstellen Sie eine Funktion in app.js
/*Function to get the app root folder*/
InformationsquelleAutor der Antwort Karthik M
Oben auf der Haupt-Datei hinzufügen:
Dann in irgendeiner Datei, die Sie brauchen:
mainDir
ist Global definiert, wenn Sie es brauchen, nur in der aktuellen Datei - verwenden__dirname
statt.main.js
,index.js
,gulpfile.js
.InformationsquelleAutor der Antwort Dariusz Sikorski
Machen es sexy ??.
Drei einfache Schritte, um das Problem zu lösen hässlich Weg.
npm install sexy-require --save
Gehören
require('sexy-require')
einmal auf der Oberseite Ihrer Hauptanwendungsdatei.Optionaler Schritt. - Pfad-Konfiguration kann definiert werden, in
.paths
- Datei auf root-Verzeichnis des Projekts.InformationsquelleAutor der Antwort sultan
Bekommen alle Pfade, die in den wichtigsten Modulen und filtern diejenigen, die mit "node_modules",
dann Holen Sie sich die erste der verbleibenden Pfad-Liste. Unerwartetes Verhalten wird nicht werfen Fehler, nur ein
undefined
.Funktioniert gut für mich, auch beim aufrufen ie
$ mocha
.InformationsquelleAutor der Antwort Andre Figueiredo
bekommen aktuelle Datei - Pfad:
definieren Sie in dieser Datei:
Verwendung in der Datei:
API:
StackTrace
InformationsquelleAutor der Antwort user1012316
Versuchen
path._makeLong('some_filename_on_root.js');
Beispiel:
Zurückkehren vollständigen Pfad von der Wurzel Ihrer Knoten-Anwendung (gleiche position-Paket.json)
InformationsquelleAutor der Antwort The-x Laws