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

时间:2015-12-02 23:56:59

标签: node.js gulp

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

各种文件的路径如下:

// Gulp File
appPath\gulpfile.js

// Gulp Tasks
appPath\gulp\* 

// Gulp Developer Settings
appPath\gulp-config\* 

我使用fs.existsSync(path)来测试开发人员设置文件是否存在,如果存在,我使用require(path)来包含该文件。

我遇到的问题是fs.existsSync(path)的相对路径与require(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) is Different to fs.existsSync(Path)

1 个答案:

答案 0 :(得分:1)

是的,因为您提供给fs函数的相对路径(以及只使用文件系统路径的任何路径)将相对于当前工作目录解释为。传递给require的相对路径是相对于执行require的模块所在的目录的解释。只有少数情况下,这两者才是平等的。在您的情况下,您当前的工作目录是项目树的顶部,而当gulp/conf.js加载具有相对路径的模块时,起始目录为gulp,这就是您必须开始路径的原因与..

请注意,可选加载可以简化为:

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

if中的catch是为了忽略MODULE_NOT_FOUND,但会重新抛出其他异常。