我有一个项目使用GruntJS和grunt-contrib-sass,grunt-contrib-watch和grunt-newer。
我的主要app.scss文件使用@import指令(如
)导入一些.scss文件@import“common / vars.scss”;
如果我在主app.scss中进行更改,一切正常。问题是,当我对正在导入的文件(如vars.scss)进行更改时,app.scss不会更新。
这是我的观察任务:
watch: {
css: {
files: ['scss/**/*.scss'],
tasks: ['newer:sass'],
options: {
spawn: false,
}
}
}
这是本身的任务:
sass: {
dist: {
options: {
style: 'compressed',
noCache: true
},
/* looks for every .scss file in the scss folder (checks nested folders too),
* compile it and create another file wit the same name in the style folder */
files: [{
expand: true,
cwd: 'scss',
src: ['**/*.scss'],
dest: 'style',
rename: function (dest, src) {
var folder = src.substring(0, src.lastIndexOf('/'));
var filename = src.substring(src.lastIndexOf('/'), src.length);
filename = filename.substring(0, filename.lastIndexOf('.'));
return dest + '/' + folder + filename + '.css';
}
}]
}
}
知道如何更改Gruntfile.js以涵盖这种情况吗? :)谢谢。
答案 0 :(得分:2)
注意:这是this comment in an issue on the grunt-newer
GitHub page的最低修改副本。
我提出了这个简单的委派任务,它可以解决您希望对src
属性中指定的更改做出反应的任务:
grunt.initConfig( {
delegate: {
some_other_TASK: {
src: [ 'some/src/path/**/*.ext' ],
dest: 'some/dest/path/'
}
}
} );
grunt.registerTask( 'delegate', function() {
grunt.task.run( this.args.join( ':' ) );
} );
grunt-contrib-sass
的完整示例如下所示:
module.exports = function( grunt ) {
require( 'load-grunt-tasks' )( grunt );
grunt.initConfig( {
delegate: {
sass: {
src: [ 'scss/**/*.scss' ],
dest: 'style'
}
},
sass: {
dist: {
options: {
style: 'compressed',
noCache: true
},
files: [{
expand: true,
cwd: 'scss',
src: ['*.scss'],
dest: 'style',
ext: '.css'
}]
}
}
} );
grunt.registerTask( 'delegate', function() {
grunt.task.run( this.args.join( ':' ) );
} );
};
您只需致电newer:delegate:sass
(通过CLI或其他任务)。 grunt-newer
检查相应delegate
目标中给出的文件(我在其中包含了globbing模式**/
)。如果找到新文件(子文件夹中也是.scss
个文件),将调用相应的sass
任务(具有给定目标)。
我不确定,如果制作一个单独的grunt插件在这里会有用。
编辑:我最近将上述代码(已清理)作为单独的npm包grunt-delegate
发布。
答案 1 :(得分:-2)
我认为您的监视tasks
变量是向后的,您可以通过打开终端进行检查,转到您通常运行的目录grunt watch
但是如果不起作用则尝试运行newer:sass
如果后期作品在您的观看设置中更改该行,请尝试sass:newer
。
此外,如果您只有一个sass任务,您可以将其更改为:
watch: {
css: {
files: ['scss/**/*.scss'],
tasks: ['sass']
options: {
spawn: false
}
}
}
正如旁注,似乎你的sass有不必要的复杂重命名功能,如果你只是想把scss/**/*.scss
转换成style/**/*.css
你应该能够使用它(取自grunt-contrib-sass自述文件):
grunt.initConfig({
sass: {
dist: {
files: [{
expand: true,
cwd: 'scss',
src: ['**/*.scss'],
dest: 'styles',
ext: '.css'
}]
}
}
});
如果您有使用多个点的文件,例如:file.src.scss
将extDot: 'last'
添加到文件数组