在Cygwin中,Grunt不承认Sass

时间:2015-08-13 13:58:06

标签: sass gruntjs cygwin grunt-exec

我试图在Windows中使用Grunt创建一个非常简单的构建系统,使用Cygwin来处理我的scss / css和coffee / js文件的编译,连接和缩小。

我有问题,Grunt没有认出Sass是一个命令。

我应该注意,相同的Gruntfile,相同的任务,相同的软件包在Linux上完美运行(当然为什么!),这个问题仅与在Windows上实现相同的系统有关。

我已经正确安装了Ruby和Sass(&#34; ruby​​ -v&#34;&#34; sass -v&#34;按预期工作)我没有问题从命令行编译scss到css < / p>

$ sass --update sass:css

它有效地将所有.scss文件转换为.css

Grunt本身没有问题,将咖啡编译成js,连接js或css文件,缩小它们并观察变化。

这里是完整的Gruntfile.js,供参考

module.exports = function(grunt) {

    grunt.initConfig({
            concat: {
                    js: {
                            src: 'js/*.js',
                            dest: 'build/js/scripts.js',
                    },
                    css: {
                            src: 'css/*.css',
                            dest: 'build/css/theme.css',
                    },
            },
            uglify: {
                    jsMin : {
                            files: {
                                    'build/js/scripts.min.js' : ['build/js/scripts.js']
                            },
                    },
            },
            cssmin: {
                    styleMin : {
                            files : {
                                    'build/css/theme.min.css' : ['build/css/theme.css']
                            },
                    },
            },
            watch: {
                    jsW: {
                            files: ['js/**/*.js'],
                            tasks: ['concat:js','uglify:jsMin'],
                    },
                    cssW: {
                            files: ['css/**/*.css'],
                            tasks: ['concat:css','cssmin'],
                    },
                    sassW: {
                            files: ['sass/**/*.scss'],
                            tasks: ['exec']
                    }
            },
            exec: {
                    Sass    : 'sass --update sass:css',
                    Coffee  : 'coffee -o js/ -c coffee/'
            }
    });



    grunt.loadNpmTasks('grunt-contrib-watch');
    grunt.loadNpmTasks('grunt-contrib-concat');
    grunt.loadNpmTasks('grunt-contrib-uglify');
    grunt.loadNpmTasks('grunt-contrib-cssmin');
    grunt.loadNpmTasks('grunt-exec');

    grunt.registerTask('default',['exec','concat','uglify','cssmin','watch']);

};

如果然后我开始grunt它会显示以下警告

  

跑步&#34; exec:Sass&#34; (执行)任务

     
    

&#39; SASS&#39;不被识别为内部或外部命令,可操作程序或批处理文件。

         

退出代码:1。

         

警告:任务&#34;执行:Sass&#34;失败。使用--force继续。

         

因警告而中止。

  

正如我之前所说的那样,系统在linux上完美运行,所以我猜我的路径有问题,但为什么那么从命令行开始工作就好了,而不是通过grunt识别?

最后我要指出的是,在一些挖掘和测试期间尝试猜测问题是什么之前发布在SO上,我发现调用任何没有.exe文件的bash函数cygwin / bin显示相同的错误

http://i.stack.imgur.com/DGLe5.png(测试文件&#39; sass&#39;&#39; sdoc&#39;&#39; ruby​​.exe&#39;)

修改了grunt-exec进行测试:

exec: {
                    Sass    : 'sass -v',
                    Ruby    : 'ruby -v',
                    Sdoc    : 'sdoc -v',

}

他们在grunt --force之后显示以下内容 http://i.stack.imgur.com/3boy7.png

从正常的命令行

$ sass -v && ruby -v && sdoc -v
Sass 3.4.16 (Selective Steve)
ruby 2.0.0p598 (2014-11-13) [x86_64-cygwin]
4.2.0

我真的不知道从哪里开始,任何帮助都会受到赞赏。

1 个答案:

答案 0 :(得分:1)

我仍然没有找到解决问题的方法。 但是我确实找到了一个工作正常的解决方法,以防万一有人感兴趣或者遇到了同样的问题。

解决方案涉及直接通过Ruby运行sass(我的grunt-exec任务识别),所以我编辑了我的Gruntfile.js,如下所示:

exec: {
                Sass    : 'ruby sass.rb'
        }

调用主目录中的sass.rb文件,这是一个ruby脚本文件。

require "sass"
options = {
    :syntax => :scss,
    :style => :compressed,
    :load_paths => ['./src/sass/']
    # load_paths is required in case your 'master.scss' files use @import to attach other scss files 
}

render = Sass::Engine.new(File.read("src/sass/master.scss"), options).render
File.write("src/css/master.css", render)

您可以在SASS documentation

中找到更多选项

我知道这不是我的问题的实际答案,但这是唯一可以立即解决的问题。我仍然会尝试弄清楚为什么更常见的解决方案(grunt-contrib-sassgrunt-exec)无法正常工作,但通过这种解决方法,我的构建系统已经启动并运行。