Y a-t-il un autre moyen, autre que process.cwd()
pour obtenir le nom du chemin du répertoire racine du projet en cours. Est-ce que Node implémente quelque chose comme la propriété de Ruby, Rails.root
,. Je cherche quelque chose qui soit constant et fiable.
Réponses
Trop de publicités?Cela va descendre dans l'arborescence du répertoire jusqu'à ce qu'il contienne un fichier node_modules
qui indique généralement le répertoire Root de votre projet :
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))
}
Il s'assure également qu'il n'y a pas node_modules
dans le chemin d'accès renvoyé, car cela signifie qu'il est contenu dans un paquet d'installation imbriqué.
Créer une fonction dans app.js
/*Function to get the app root folder*/
var appRootFolder = function(dir,level){
var arr = dir.split('\\');
arr.splice(arr.length - level,level);
var rootFolder = arr.join('\\');
return rootFolder;
}
// view engine setup
app.set('views', path.join(appRootFolder(__dirname,1),'views'));
Vous pouvez simplement ajouter le chemin du répertoire racine dans la variable express app et obtenir ce chemin de l'application. Pour cela, ajoutez app.set('rootDirectory', __dirname);
dans votre fichier index.js ou app.js. Et utilisez req.app.get('rootDirectory')
pour obtenir le chemin du répertoire racine dans votre code.
Vieille question, je sais, mais aucune question ne mentionne d'utiliser progress.argv
. Le tableau argv comprend un chemin d'accès complet et un nom de fichier (avec ou sans extension .js) qui a été utilisé comme paramètre pour être exécuté par node. Comme il peut également contenir des drapeaux, vous devez le filtrer.
Ce n'est pas un exemple que vous pouvez utiliser directement (parce que j'utilise mon propre cadre) mais je pense que cela vous donne une idée de la façon de procéder. J'utilise également une méthode de cache pour éviter que l'appel de cette fonction ne stresse trop le système, notamment lorsqu'aucune extension n'est spécifiée (et qu'une vérification de l'existence du fichier est nécessaire), par exemple :
node myfile
ou
node myfile.js
C'est la raison pour laquelle je le mets en cache, voir aussi le code ci-dessous.
function getRootFilePath()
{
if( !isDefined( oData.SU_ROOT_FILE_PATH ) )
{
var sExt = false;
each( process.argv, function( i, v )
{
// Skip invalid and provided command line options
if( !!v && isValidString( v ) && v[0] !== '-' )
{
sExt = getFileExt( v );
if( ( sExt === 'js' ) || ( sExt === '' && fileExists( v+'.js' )) )
{
var a = uniformPath( v ).split("/");
// Chop off last string, filename
a[a.length-1]='';
// Cache it so we don't have to do it again.
oData.SU_ROOT_FILE_PATH=a.join("/");
// Found, skip loop
return true;
}
}
}, true ); // <-- true is: each in reverse order
}
return oData.SU_ROOT_FILE_PATH || '';
}
};