Gulp require(Path)与fs.existsSync(Path)不同

如果开发人员特定的文件存在,我想用开发人员特定的variables覆盖默认variables。

各种文件的path如下:

// Gulp File appPath\gulpfile.js // Gulp Tasks appPath\gulp\* // Gulp Developer Settings appPath\gulp-config\* 

我正在使用fs.existsSync(path)来testing开发者设置文件是否存在,如果它使用require(path)来包含该文件。

fs.existsSync(path)的问题是fs.existsSync(path)的相对path与require(path)的相对path不同。

 // I don't understand why the check for file and the require of that file, need slightly different paths var developerConfigFile = './gulp-config/' + process.env.NODE_DEV + '.js'; var developerConfigFileForRequire = '../gulp-config/' + process.env.NODE_DEV + '.js'; if (fs.existsSync(developerConfigFile)) { console.log('Found: ' + developerConfigFile); require(developerConfigFileForRequire); } else { console.log('NOT Found: ' + developerConfigFile); } 

Gulp require(Path)与fs.existsSync(Path)不同

是的,这是因为你给fs函数的相对path(以及任何只使用文件系统path的东西)将被解释为相对于当前的工作目录 。 传递给require的相对path是相对于正在执行require的模块所在的目录解释的。 只有在数量有限的情况下,这两者才是平等的。 在你的情况下,你当前的工作目录是你的项目树的顶部,而当gulp/conf.js加载一个相对path的模块时,起始目录是gulp ,这就是为什么你必须用..开始你的path。

请注意,可选的加载可以简化为这样的事情:

 try { require(path_to_module); } catch (e) { if (e.code !== "MODULE_NOT_FOUND") throw e; } 

catchif使得MODULE_NOT_FOUND被忽略,但其他exception被重新抛出。