[GruntJS] loadNpmTasksで、カレントディレクトリ以外のnode_modulesを読み込む方法
こんにちは、です。
ハイパーマイナーなネタですが、GruntJSのloadNpmTasksで、 現在のディレクトリと異なるディレクトリにあるnode_modulesを読み込む実装をブログに書きたいと思います。
そして、フロントエンドのビルドにはGrunt.jsを使おうと思って、以下のようなディレクトリ構成にしました。
フロントエンドの開発はpublicディレクトリ以下で行い、SCSSは、public/dev/scssに保存します。
フロントエンド用のビルドディレクトリは、public/devにして、サーバーサイドの実装と分けるようにしました。
ただ、npmの管理は一括にしたかったので、プロジェクトルートのpackage.jsonにdependenciesとdevDependenciesに分けて管理することにしました。
この場合に、Grunt.jsで利用するnode_modulesは、「../../node_modules」を使いたいということになったのです。
カレントディレクトリ以外のnode_modulesをロード対象にする場合には、読み込み前にディレクトリ移動をする必要があるようです。
以下のように実装するとうまく動きました。
これで動いたので、一件落着です。
Nodeをサーバーサイドに使うWebアプリケーションでGrunt.jsを使う場合には、他の方はどうしてるのか気になるところです。
最後までご覧頂きましてありがとうございました。
ハイパーマイナーなネタですが、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を使う場合には、他の方はどうしてるのか気になるところです。
最後までご覧頂きましてありがとうございました。

