Sass Cygwin 中的 Grunt 无法识别

Sass not recognized by Grunt in Cygwin

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

我遇到 Grunt 无法将 Sass 识别为命令的问题。

我应该注意到,相同的 Gruntfile、相同的任务、相同的包在 linux 上运行良好(当然为什么!)并且这个问题仅与在 Windows 上实现相同的系统有关.

我已经正确安装了 Ruby 和 Sass("ruby -v" 和 "sass -v" 都按预期工作)而且我编译 scss 没有问题css 来自命令行

$ sass --update sass:css

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

Grunt 本身没有问题,将 coffee 编译成 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 它会显示以下警报

Running "exec:Sass" (exec) task

'sass' is not recognized as an internal or external command, operable program or batch file.

Exited with code: 1.

Warning: Task "exec:Sass" failed. Use --force to continue.

Aborted due to warnings.

正如我之前所说,系统在 linux 上完美运行,所以我猜想我的路径有问题,但为什么 sass 从命令行可以正常工作但未被识别通过咕噜?


我想指出的最后一件事是,在进行一些挖掘和测试以尝试猜测问题所在之前,我发现调用任何 bash 函数具有not an .exe file in cygwin/bin 显示相同的错误

http://i.stack.imgur.com/DGLe5.png(测试文件 'sass' 'sdoc' 和 'ruby.exe')

修改后的 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

我真的不知道从这里去哪里,任何帮助将不胜感激。

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

解决方案涉及 运行 sass 直接通过 Ruby(我的 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)不起作用,但是通过这个解决方法,我已经启动了我的构建系统并且 运行.