2013-07-29 16 views
5

Büyük (300-ish) scss projeleriyle dolu bir dizini izleyecek bir node.js programı yazıyorum. Grunt-watch (ya da herhangi bir işe yarayacak olursa olsun), bir scss dosyası değiştiğinde, pusula ile derlenecek, çıktı dosyası ayrı bir dizine taşınacaktır, örneğin:Dosyaya göre hile izleme görevleri nasıl değiştirildi?

./1234/style.scss hırıltı-izle

dosya oldu proje dizin güncellenen /foo/bar/baz/1234/style.css hırıltı-pusula >> besbelli ishal >> değiştirildi çok önemli (eğer tüm pürüzlü dosyaları aynı dizine gönderdiyse, pürüzlü ve kullanılamaz olurlardı ve korsan otomasyon amaçsız olurdu). Tüm dosyaların doğru yere yönlendirildiğinden emin olmak için, bir css dosyasının her güncellendiği anda dinamik olarak pusula-pusula ayarlarını değiştiriyorum.

Numune 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']); 

    }); 

}; 

Ancak bu işe yaramaz. Eğer ayrıntılı modda 'grunt watch' çalıştırırsanız, grunt'ın hem grunt.event.on işlevini hem de saat görevini ayrı işlemlerde çalıştırdığını göreceksiniz. Gruntfile öğesinin ikinci ayrıştırma işlemi, tüm event.on yapılandırma değişikliklerini yukarıdaki varsayılanlara döndürür ve pusula çalışmaz.

Etkinliklerde görüldüğü gibi, pusula'nın yapılandırma değişikliklerini koruyacak olan event.on işleviyle aynı işlemde çalıştırıldığından emin olmak için bir grunt.task.run() eklemeye çalıştım. Ancak görev, muhtemelen I'm doing it wrong nedeniyle çalıştırmayı reddetti.

Ne yazık ki, grunt.event.on değişkenleri tanımlı grunt-watch görevine gönderilmez, aksi halde pusula ayarlarını değiştirecek ve aynı işlemde pusulayı çalıştıracak özel bir işlev yazabilirim.

Saat işlevini pusulaya dönüştürerek bunu pürüzlendirmeden uygulamayı denedim, ancak pusula yalnızca proje başına bir statik çıkış yolu depolayabilir ve yalnızca bir projeyi aynı anda izleyebilir.

Site adını bir parametre olarak alan bir düğüm programı ekleyerek, bu sorunu çözdüm, fs kullanarak koşarak grunfile.js dosyasını yeniden yazdıktan sonra exec işlevi aracılığıyla 'grunt watch' özelliğini çalıştırıyorum. Bununla birlikte, bunun kendi dezavantajları vardır (grunt.log verilerini göremiyorum) ve korkunç kıvrımlıdır, bu yüzden onu değiştirmek isterim.

Herhangi bir içgörü için çok teşekkür ederim.

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

Bu konuda daha fazla bilgi için belgelerin this section bakınız:

+0

Bu, sorunuzu yanıtlamıyor, ancak neden pusula için homurdanmaya katkıda bulunacak? Pusula zaten "pusula izle" – pllee

+0

ile birlikte geliyor "İzleme" işlevinin aynı bağlamda çalışması için : watch görev yapılandırmanızda 'options: {nospawn: true}' belirtmeniz gerekir ([bu bölüme bkz. Dokümanlar] (https://github.com/gruntjs/grunt-contrib-watch#compiling-files-as-needed)). –

+0

@ go-oleg Teşekkürler! Bu harika çalışıyor. Şaşırmış olduğumu şaşırdım. Dokümanlarda, 'nospawn'ın' benim gibi problemleri çözdüğünü söylediğim gibi şaşırmadım. – anachronism

cevap

11

Aynı bağlamda izle çalıştırmak için saatinizin görev config

options : { nospawn : true }

belirtmeniz gerekir.

+0

Bu cevabı takdir ettim. Dokümantasyonu okuduktan sonra "bağlam" ın anlamı ve nospawn'ın seçeneği tarafından nasıl etkilendiği açık değildi. Teşekkürler! – jerome

+0

Cevabınız için teşekkür ederiz! – vgrinko

+2

Bu yanıta bir güncelleme eklemek için, Haziran 2016 itibariyle seçenek şu anda: "spawn: false" – BigHeadCreations

İlgili konular