Javascript 在基于Heroku的插件架构的应用程序中,我应该如何处理节点模块依赖关系?

Javascript 在基于Heroku的插件架构的应用程序中,我应该如何处理节点模块依赖关系?,javascript,node.js,heroku,Javascript,Node.js,Heroku,我正在开发一个基于node.js的框架/服务器。这个框架启动一个express服务器并自动从本地目录加载所有插件。框架和各个插件都有自己的git存储库 框架如下:(参见server.js了解插件加载) 这里有一个插件示例:(有关插件定义/引导文件,请参见connector.js) 这一切在当地都很好。现在是时候把它部署到Heroku了。我的计划是编写一个小脚本,克隆框架+指定的插件,并构建一个准备部署的文件夹结构 我在这里写了这个脚本: 现在,关于我的问题,是否可以指示Heroku在应用程序的根

我正在开发一个基于node.js的框架/服务器。这个框架启动一个express服务器并自动从本地目录加载所有插件。框架和各个插件都有自己的git存储库

框架如下:(参见server.js了解插件加载)

这里有一个插件示例:(有关插件定义/引导文件,请参见connector.js)

这一切在当地都很好。现在是时候把它部署到Heroku了。我的计划是编写一个小脚本,克隆框架+指定的插件,并构建一个准备部署的文件夹结构

我在这里写了这个脚本:

现在,关于我的问题,是否可以指示Heroku在应用程序的根目录(框架)和特定子目录(每个插件)中进行“npm安装”

我知道node会查看最近的node_modules文件夹,该文件夹与加载模块的脚本相关,因此如果插件尝试加载模块,node会首先查看app_root/plugins/plugin_name/node_modules-这正是我想要的,我只需要Heroku确保模块在那里

我最初计划让我的构建脚本进入不同的目录并运行npm安装,但后来我想起Heroku将自己进行npm安装

我的另一个选择是编写一些代码,检查每个plugins package.json文件中的所有依赖项,然后对所有依赖项进行联合,并将它们写入到package.json中的应用程序根目录中。这样,当Heroku安装npm时,将安装所有依赖项。这听起来很脆弱,当不同插件指定同一模块的不同版本时,可能会失败


所有这些最后都引出了一个问题,我是不是做错了?我是否应该考虑不同的体系结构/回购结构等?

在花了一段时间追求脚本选项后,我意识到我应该利用节点模块系统和NPM来为我解决所有这些问题

我最终删除了脚本,而不是框架从插件目录加载插件,它现在希望在实例化时传递一个要加载的插件数组,这使得整个过程变得非常简单

框架/服务器

/**
 * Configures the Node.js Server.
 * @type {*}
 */

var _ = require('underscore'),
    express = require('express'),
    app = express(),
    port = process.env.PORT || 3003;

module.exports = {

    /**
     * Starts the connector multi server.
     * @param {Object} options A hash of options to configure the multi server.
     * @param {Array} options.connectors An array of multi server connectors to load.
     */
    start: function (options) {

        // Sanitize the options
        options = options || {connectors: []};

        // Configure express
        console.log('Configuring express...');
        require('./config/config.js')(app, express);
        require('./config/http-error.js');

        // Load controllers
        console.log('Loading controllers...');
        require('./controllers/appsecute.js')(app);
        require('./controllers/oauth2-client.js')(app);

        // Load connectors
        console.log('Loading connectors...');
        _.each(options.connectors, function (connector) {
            connector(app);
        });

        // Connectors have been loaded, start the multi server
        console.log('Finished loading connectors.');
        console.log('Starting multi connector server...');

        var express_app = app.listen(port);
        console.log("Multi connector server listening on port %d", port);
        return express_app;
    }
};
将框架+插件拉到一起进行部署的部署Repo

/**
 * A basic wrapper around the multi server that includes specific connector implementations ready for deployment.
 *
 * To add a new connector to the deployment:
 *  1. Add it as a dependency in package.json
 *  2. Pass it to the multi connector start() call.
 */
require('appsecute-connector-multi').server.start({
    connectors: [
        require('appsecute-connector-multi-heroku'),
        require('appsecute-connector-multi-tender'),
        require('appsecute-connector-multi-circleci'),
        require('appsecute-connector-multi-zendesk'),
        require('appsecute-connector-multi-github'),
        require('appsecute-connector-multi-travisci')
    ]
});

这样做的好处是,避免了简单性,因为在部署项目中,框架和所有单个插件都被指定为package.json中的依赖项。NPM负责拉下所有的依赖项,正如您所期望的那样:)

NPM postinstall脚本会做到这一点吗?是的,基本上,npm++
node_模块
++
require()
就是您真正需要的“基于插件的体系结构”。它被烘焙到节点:)