Javascript 在基于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时,将安装所有依赖项。这听起来很脆弱,当不同插件指定同一模块的不同版本时,可能会失败Javascript 在基于Heroku的插件架构的应用程序中,我应该如何处理节点模块依赖关系?,javascript,node.js,heroku,Javascript,Node.js,Heroku,我正在开发一个基于node.js的框架/服务器。这个框架启动一个express服务器并自动从本地目录加载所有插件。框架和各个插件都有自己的git存储库 框架如下:(参见server.js了解插件加载) 这里有一个插件示例:(有关插件定义/引导文件,请参见connector.js) 这一切在当地都很好。现在是时候把它部署到Heroku了。我的计划是编写一个小脚本,克隆框架+指定的插件,并构建一个准备部署的文件夹结构 我在这里写了这个脚本: 现在,关于我的问题,是否可以指示Heroku在应用程序的根
所有这些最后都引出了一个问题,我是不是做错了?我是否应该考虑不同的体系结构/回购结构等?在花了一段时间追求脚本选项后,我意识到我应该利用节点模块系统和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()
就是您真正需要的“基于插件的体系结构”。它被烘焙到节点:)