2013/10/02更新

[GruntJS] loadNpmTasksで、カレントディレクトリ以外のnode_modulesを読み込む方法

このエントリーをはてなブックマークに追加      

こんにちは、です。
ハイパーマイナーなネタですが、GruntJSのloadNpmTasksで、 現在のディレクトリと異なるディレクトリにあるnode_modulesを読み込む実装をブログに書きたいと思います。

画像

引用:http://www.flickr.com/photos/raymondklaassen/10035459583




ブログを書こうと思った背景

現在、node.jsのExpress3を用いたWebアプリケーションを制作しています。
そして、フロントエンドのビルドにはGrunt.jsを使おうと思って、以下のようなディレクトリ構成にしました。

  • - app.js
  • + routes
  • + models
  • + views
  • + public
    • + javascripts
    • + stylesheets
    • + images
    • + dev
      • - Gruntfile.js
      • + scss
  • + node_modules
  • - package.json

(プレフィックスの「-」はファイルを、「+」はディレクトリを意味します)



フロントエンドの開発はpublicディレクトリ以下で行い、SCSSは、public/dev/scssに保存します。
フロントエンド用のビルドディレクトリは、public/devにして、サーバーサイドの実装と分けるようにしました。
ただ、npmの管理は一括にしたかったので、プロジェクトルートのpackage.jsonにdependenciesとdevDependenciesに分けて管理することにしました。
この場合に、Grunt.jsで利用するnode_modulesは、「../../node_modules」を使いたいということになったのです。



カレントディレクトリ以外のnode_modulesからloadNpmTasksを行う

上記のように配置されたGruntfile.jsに、普通に以下のようなloadNpmTasksを記載すると、
module.exports = function(grunt) {

    // load tasks.
    grunt.loadNpmTasks('grunt-contrib-requirejs');
    grunt.loadNpmTasks('grunt-contrib-concat');
    grunt.loadNpmTasks('grunt-contrib-watch');

    /*以下省略*/
}
以下のようなエラーが表示されます。
>> Local Npm module "grunt-contrib-requirejs" not found. Is it installed?
>> Local Npm module "grunt-contrib-concat" not found. Is it installed?
>> Local Npm module "grunt-contrib-watch" not found. Is it installed?
残念です。どうもloadNpmTasksは、カレントディレクトリのnode_modulesを探しに行くようで、 カレントディレクトリ以外のnode_modulesは読み込み対象にしないようです。

カレントディレクトリ以外のnode_modulesをロード対象にする場合には、読み込み前にディレクトリ移動をする必要があるようです。
以下のように実装するとうまく動きました。
module.exports = function(grunt) {

    // load tasks.
    var cwd = process.cwd();
    process.chdir('../../');
    grunt.loadNpmTasks('grunt-contrib-requirejs');
    grunt.loadNpmTasks('grunt-contrib-concat');
    grunt.loadNpmTasks('grunt-contrib-watch');
    process.chdir(cwd);

    /*以下省略*/
}
loadNpmTasksを行う前に、「../../」ディレクトリに移動して、 loadNpmTasksが終わったら元のディレクトリに戻るという作りです。
これで動いたので、一件落着です。



最後に

すんごいマイナーなネタですが、loadNpmTasksの読み込み制御に関する記事でした。
Nodeをサーバーサイドに使うWebアプリケーションでGrunt.jsを使う場合には、他の方はどうしてるのか気になるところです。

最後までご覧頂きましてありがとうございました。





こんな記事もいかがですか?

RSS画像

もしご興味をお持ち頂けましたら、ぜひRSSへの登録をお願い致します。