2013-07-29 4 views
5

큰 (300-ish) scss 프로젝트로 채워진 디렉토리를 볼 node.js 프로그램을 작성 중입니다. scunt 파일이 변경 될 때마다 나침반이 컴파일 될 때마다 출력 파일이 별도의 디렉토리 (예 :변경된 파일을 기반으로 잡담 감시 작업을 수정하는 방법은 무엇입니까?

)로 이동하도록 Grunt-watch (노드 모듈을 통해 실행하거나 자체적으로 작동)가 구성됩니다.

./1234/style.scss는 꿀꿀 시계는

파일에 있던 프로젝트 디렉토리를 업데이트 /foo/bar/baz/1234/style.css 꿀꿀 - 나침반 >> 분명히 실행 >> 변경되었습니다 매우 중요합니다. (험악한 컴퍼스가 컴파일 된 모든 파일을 같은 디렉토리에 보냈다면, 뒤죽박죽이되어 사용할 수 없으며 과자 자동화는 목적이 없습니다.) 모든 파일이 올바른 위치로 라우팅되도록하기 위해 CSS 파일이 업데이트 될 때마다 동적으로 나침반 설정을 변경합니다.

샘플 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 기능과 watch 태스크를 모두 실행하는 것을 볼 수 있습니다. gruntfile의 두 번째 구문 분석은 내 모든 이벤트를 되돌립니다. 기본 설정을 위의 기본값으로 변경하면 나침반이 실행되지 않습니다.

이벤트에서 볼 수 있듯이 grunt.task.run()을 추가하여 나침반이 구성 변경 사항을 보존하는 event.on 함수와 동일한 프로세스에서 실행되었는지 확인하려고했습니다. 그러나 작업이 실행을 거부했기 때문에 가능성이 I'm doing it wrong입니다.

불행히도, grunt.event.on 변수는 정의 된 grunt-watch 태스크로 보내지지 않습니다. 그렇지 않으면 나침반 설정을 변경 한 다음 동일한 프로세스에서 나침반을 실행하는 사용자 정의 함수를 작성할 수 있습니다.

나침반을 사용하지 않고이 기능을 구현하려고했지만 시계 기능을 나침반으로 빌드했지만 나침반은 프로젝트 당 하나의 정적 출력 경로 만 저장할 수 있으며 한 번에 하나의 프로젝트 만 볼 수 있습니다.

사이트 이름을 매개 변수로 사용하는 노드 프로그램을 추가하고 fs를 사용하여 grunfile.js를 다시 작성한 다음 exec 함수를 통해 'grunt watch'를 실행하여이 문제를 해결했습니다. 그러나 이것은 단점이 있습니다 (나는 grunt.log 데이터를 볼 수 없습니다). 그리고 끔찍하게 뒤얽힌 것입니다. 그래서 그것을 바꾸고 싶습니다.

아무쪼록 고맙습니다.

watch: { 
    files: './*/*.scss', 
    tasks: ['compass'], 
    options : { nospawn : true } 
} 

이에 대한 추가 정보를 원하시면 문서의 this section를 참조하십시오

+0

귀하의 질문에 대한 답변이 없지만 왜 나침반이 나침반을 볼 수 있습니까? 나침반은 이미 나침반 시계와 함께 제공됩니다. – pllee

+0

watch 작업 설정에서'watch :'가 동일한 컨텍스트에서 실행되도록하려면'options : {nospawn : true}'를 지정해야합니다 ([이 섹션은 문서를 참조하십시오] (https : /github.com/gruntjs/grunt-contrib-watch#compiling-files-as-needed)). –

+0

@ go-oleg 감사합니다! 그것은 훌륭하게 작동합니다. 나는 문서에서 그것이 'nospawn'이 나의 것 같은 문제를 해결한다고 직접적으로 말한 것처럼 나는 놀랐다. – anachronism

답변

11

당신은 같은 맥락에서 시계 실행을 가지고 시계 작업 설정에

options : { nospawn : true }

을 지정해야합니다.

+0

감사합니다. 문서를 읽었지만 "문맥"의 의미와 그것이 'nospawn'옵션에 의해 어떻게 영향을 받았는지에 대해서는 명확하지 않았습니다. 감사! – jerome

+0

답변 해 주셔서 감사합니다. – vgrinko

+2

이 답변에 대한 업데이트를 추가하려면 2016 년 6 월 현재 옵션이 'spawn : false'입니다. – BigHeadCreations