1

私は node.js ベースのフレームワーク/サーバーに取り組んでいます。このフレームワークは Express サーバーを起動し、ローカル ディレクトリからすべてのプラグインを自動的に読み込みます。フレームワークと個々のプラグインには、それぞれ独自の git リポジトリがあります。

フレームワークはこちら: https://github.com/Appsecute/appsecute-connector-multi (プラグインの読み込みについては server.js を参照)。

プラグインの例は次のとおりです: https://github.com/Appsecute/appsecute-connector-multi-heroku (プラグイン定義/ブートストラップ ファイルについては、connector.js を参照してください)。

これはすべてローカルで正常に機能します。次に、Heroku にデプロイします。私の計画は、フレームワークと指定されたプラグインのクローンを作成し、デプロイの準備が整ったフォルダー構造を構築する小さなスクリプトを作成することでした。

ここにこのスクリプトを書きました: https://github.com/Appsecute/appsecute-connector-multi-deployment

さて、私の質問ですが、アプリケーションのルート (フレームワーク) と特定のサブディレクトリ (各プラグイン) の両方で「npm install」を実行するよう Heroku に指示することは可能ですか?

ノードは、モジュールをロードしているスクリプトに関連する最も近い node_modules フォルダー内を検索することを知っているため、プラグインがモジュールをロードしようとすると、ノードは最初に app_root/plugins/plugin_name/node_modules を検索します-これはまさに私が望むものです、モジュールがそこにあることを確認するために Heroku が必要なだけです。

最初は、ビルド スクリプトをさまざまなディレクトリに移動させて npm インストールを実行することを計画していましたが、Heroku が独自の npm インストールを実行することを思い出しました。

私の他のオプションは、各プラグイン package.json ファイルのすべての依存関係を検査するコードを記述し、すべての依存関係を結合して、アプリのルートにある package.json に書き出すことです。このように、Heroku が npm install を実行すると、すべての依存関係がインストールされます。これは脆く聞こえ、異なるプラグインが同じモジュールの異なるバージョンを指定するとおそらく失敗します。

そして、これらすべてが最終的に疑問を投げかけます。私はこれを間違っているのでしょうか? 別のアーキテクチャ/レポ構造などを検討する必要がありますか?

4

1 に答える 1

2

スクリプト オプションを検討するのにしばらく費やした後、Node モジュール システムと 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;
    }
};

デプロイのためにフレームワークとプラグインをまとめたデプロイ リポジトリ

/**
 * 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 がすべての相互依存関係を、期待どおりに引き下ろすことです。 :)

于 2013-04-13T22:13:55.597 に答える