[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を使う場合には、他の方はどうしてるのか気になるところです。
最後までご覧頂きましてありがとうございました。