503 Stimmen

Ermitteln des Projektstamms aus einer laufenden node.js-Anwendung

Gibt es einen anderen Weg, außer process.cwd() , um den Pfadnamen des Root-Verzeichnisses des aktuellen Projekts zu erhalten. Implementiert Node so etwas wie die Eigenschaft von Ruby, Rails.root ,. Ich bin auf der Suche nach etwas, das konstant und zuverlässig ist.

3voto

Andre Figueiredo Punkte 11844

process.mainModule es Abgelehnt seit Version 14.0.0. Wenn Sie sich auf die Antwort beziehen, geben Sie bitte verwenden. require.main Der Rest bleibt bestehen.

process.mainModule.paths
  .filter(p => !p.includes('node_modules'))
  .shift()

Alle Pfade in den Hauptmodulen holen und die mit "node_modules" herausfiltern, dann den ersten der verbleibenden Pfade abrufen. Unerwartetes Verhalten wird keinen Fehler auslösen, nur eine undefined .

Funktioniert bei mir gut, auch bei Anrufen $ mocha .

2voto

Dariusz Sikorski Punkte 4063

Am Anfang der Hauptdatei hinzufügen:

mainDir = __dirname;

Verwenden Sie sie dann in jeder beliebigen Datei:

console.log('mainDir ' + mainDir);
  • mainDir ist global definiert, wenn Sie es nur in der aktuellen Datei benötigen - verwenden Sie __dirname stattdessen.
  • Die Hauptdatei befindet sich in der Regel im Root-Ordner des Projekts und hat den folgenden Namen main.js , index.js , gulpfile.js .

2voto

Vincent Lab Punkte 61

Wenn Sie das Projekt Root aus einer laufenden node.js-Anwendung heraus ermitteln wollen, können Sie dies einfach tun.

process.mainModule.path

1voto

Julien Punkte 4595

Dadurch wird der Verzeichnisbaum nach unten durchlaufen, bis er eine node_modules Verzeichnis, das in der Regel Ihr Projekt Root angibt:

const fs = require('fs')
const path = require('path')

function getProjectRoot(currentDir = __dirname.split(path.sep)) {
  if (!currentDir.length) {
    throw Error('Could not find project root.')
  }
  const nodeModulesPath = currentDir.concat(['node_modules']).join(path.sep)
  if (fs.existsSync(nodeModulesPath) && !currentDir.includes('node_modules')) {
    return currentDir.join(path.sep)
  }
  return this.getProjectRoot(currentDir.slice(0, -1))
}

Sie stellt auch sicher, dass es keine node_modules im zurückgegebenen Pfad, da dies bedeutet, dass es in einer verschachtelten Paketinstallation enthalten ist.

1voto

Manoj Rana Punkte 2092

Für mich funktioniert es

process.env.PWD

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X