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:
Bu, sorunuzu yanıtlamıyor, ancak neden pusula için homurdanmaya katkıda bulunacak? Pusula zaten "pusula izle" – pllee
ile birlikte geliyor "İzleme" işlevinin aynı bağlamda çalışması için a0>: 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)). –
@ 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