5

大量の (300 っぽい) 量の scss プロジェクトで満たされたディレクトリを監視する node.js プログラムを作成しています。Grunt-watch (ノードモジュールを介して実行するか、独自に実行するか、動作するものは何でも実行) は、scss ファイルが変更されるたびにコンパスでコンパイルされ、出力ファイルが別のディレクトリに移動されるように構成されます。たとえば、次のようになります。

./1234/style.scss が変更されました >> grunt-watch は grunt-compass を実行します >> /foo/bar/baz/1234/style.css が更新されました

ファイルがあったプロジェクト ディレクトリは明らかに非常に重要です (grunt-compass がすべてのコンパイル済みファイルを同じディレクトリに送信した場合、それらはごちゃごちゃになって使用できなくなり、grunt 自動化は無意味になります)。すべてのファイルが正しい場所にルーティングされるようにするために、css ファイルが更新されるたびに grunt-compass の設定を動的に変更しています。

サンプル gruntfile:

module.exports = function(grunt) {

grunt.initConfig({
    pkg: grunt.file.readJSON('package.json'),
    watch: {
      files: './*/*.scss',
      tasks: ['compass']
    },
    compass: {
      origin:{
        options: {
          //temportary settings to be changed later
          sassDir: './',
          cssDir: './bar',
          specify: './foo.scss'
        }
      }
    }
  });

  grunt.loadNpmTasks('grunt-contrib-watch');
  grunt.loadNpmTasks('grunt-contrib-compass');

  grunt.event.on('watch', function(action, filepath, target) {
    var path = require('path');
    grunt.log.writeln(target + ': ' + filepath + ' might have ' + action);
    var siteDirectory = path.dirname(filepath);

    //changes sass directory to that of the changed file
    var option = 'compass.origin.options.sassDir';
    var result = __dirname + '/' + siteDirectory;
    grunt.log.writeln(option + ' changed to ' + result);
    grunt.config(option, result);

    //customizes css output directory so that file goes to correct place
    option = 'compass.origin.options.cssDir';
    result = path.resolve(__dirname, '../', siteDirectory);
    grunt.log.writeln(option + ' changed to ' + result);
    grunt.config(option, result);

    //grunt.task.run(['compass']);

  });

};

ただし、これは機能しません。詳細モードで「grunt watch」を実行すると、grunt が grunt.event.on 関数と監視タスクの両方を別々のプロセスで実行することがわかります。gruntfile の 2 回目の解析では、すべての event.on 構成の変更が上記のデフォルトに戻され、コンパスの実行に失敗します。

event.on のコメントに見られるように、grunt.task.run() を追加して、コンパスが event.on 関数と同じプロセスで実行されるようにしました。これにより、構成の変更が保持されます。ただし、タスクの実行が拒否されたのは、おそらく私のやり方が間違っているためです。

残念ながら、grunt.event.on 変数は、定義された grunt-watch タスクに送信されません。それ以外の場合は、コンパスの設定を変更し、同じプロセスでコンパスを実行するカスタム関数を作成できます。

コンパスにビルドされたウォッチ関数を使用して、うなり声なしでこれを実装しようとしましたが、コンパスはプロジェクトごとに 1 つの静的出力パスしか保存できず、一度に 1 つのプロジェクトしか監視できません。

私は現在、サイト名をパラメーターとして受け取り、fs を使用して実行して grunfile.js を書き換え、次に exec 関数を介して「grunt watch」を実行するノード プログラムを追加することで、この問題を回避しています。ただし、これには独自の欠点があり (grunt.log データを表示できません)、恐ろしく複雑なので、変更したいと思います。

洞察をありがとうございました。

4

1 に答える 1