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.
Antworten
Zu viele Anzeigen?
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
.
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
.
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.