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); }
是的,这是因为你给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; }
catch
的if
使得MODULE_NOT_FOUND
被忽略,但其他exception被重新抛出。