您可以集中 node_modules 文件夹吗?

Can you centralize the node_modules folder?

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

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

我已经将每个项目的配置传递到 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

然而这显然returns

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

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

您有两个选择:

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

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

    不过真的不推荐,因为这样很难推断出模块的位置。您还必须在每台要构建项目的机器上设置环境变量(尽管您可以为此编写一个 shell 脚本包装器)。

  2. 创建 gulp-frameworkproject-aproject-b 子目录。

    如果在当前目录中找不到模块,

    节点 traverses all parent directories 正在寻找 node_modules 文件夹,因此您的项目可以从 gulp-frameworks文件夹。

  3. 对于 Windows,更新 gulpfile.js.

    中的 NODE_PATH 变量

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

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

    注意:进程覆盖 HAS 包含在第一个 require 方法之前。

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

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

    ../gulp/ 里面我们有 index.js:

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