你可以集中node_modules文件夹吗?

时间:2016-05-19 23:25:33

标签: node.js frameworks gulp environment-variables shared

我有很多项目都遵循特定的文件夹结构和约定。

我不想复制整个项目,而是希望每个项目都有一个配置对象,每个项目都链接到全局框架。

我已经将配置传递给每个项目的index.js,但是当我从每个项目中删除node_modules文件夹时,它不再有效。

示例:

/gulp-framework
    tasks/
    index.js
    package.json
    node_modules/
/project-a
    gulpfile.js
    configuration.js
/project-b
    gulpfile.js
    configuration.js

因此,使用上述结构,理想的方法是运行:

cd /project-a && gulp

然而,这显然会返回

Cannot find module 'gulp', please try npm install gulp

所以我的问题是,有没有办法在项目中使用gulpfile,但node_modules路径是否设置为全局node_modules文件夹?

1 个答案:

答案 0 :(得分:1)

您有两种选择:

  1. Loading from global modules。例如,在Linux / Mac上,您可以像这样设置NODE_PATH变量:

    export NODE_PATH="/path/to/gulp-framework/node_modules"
    

    但并不是真的值得推荐,因为这样很难说明模块的位置。您还必须在要构建项目的每台计算机上设置环境变量(尽管您可以为此编写shell脚本包装器)。

  2. 制作project-aproject-bgulp-framework个子目录。

    如果在当前目录中找不到模块,节点traverses all parent directories会查找node_modules个文件夹,因此您的项目可以继续"继承"来自gulp-frameworks文件夹的模块。

  3. 对于Windows,请更新NODE_PATH中的gulpfile.js变量。

    下面更新了全局node_path变量,当你最初运行gulp时,所有节点进程都已经实例化了,所以我们再次运行_initPaths()方法,以便它重新使用更新的node_path变量:

    process.env.NODE_PATH = "..gulp/node_modules";
    require("module").Module._initPaths();
    

    注意:在第一个require方法之前,该过程覆盖 HAS

    完成此操作后,您现在可以在指定的自定义node_path中要求gulp框架:

    exports.framework = require('../gulp')(require('gulp'), paramsOrOptions);

    ../gulp/内,我们有index.js

    module.exports = function(gulp, paramsOrOptions) {
       // setup your gulp framework starting here.
    }