【问题标题】:grunt watch & connect咕噜手表和连接
【发布时间】:2014-03-17 04:27:26
【问题描述】:

我对 grunt 有点陌生,想将它与 Jekyll 和一些 LESS 编译一起使用。

我现在的问题是,我已经可以通过实时重新加载和观看任务进行完整的 LESS 编译,并且可以通过 grunt 构建我的 jekyll 站点,但是我如何运行类似 jekyll serve 或 grunt-connect 和 grunt watch 的东西同时地? 我想要一个 grunt 任务,它可以监视我的 LESS 文件等,构建 jekyll 站点,然后使用 grunt-connect 或其他方式运行一个小型 Web 服务器。

到目前为止我的 Gruntfile.js:

'use strict';
module.exports = function (grunt) {

    grunt.initConfig({
        jshint: {
            options: {
                jshintrc: '.jshintrc'
            },
            all: [
                'Gruntfile.js',
                'js/*.js',
                '!js/scripts.min.js'
            ]
        },
        less: {
            dist: {
                files: {
                    'css/styles.min.css': [
                        'less/app.less'
                    ]
                },
                options: {
                    compress: true,
                    // LESS source map
                    // To enable, set sourceMap to true and update sourceMapRootpath based on your install
                    sourceMap: false,
                    sourceMapFilename: 'css/styles.min.css.map',
                    sourceMapRootpath: '/'
                }
            },
            dev: {
                files: {
                    'css/styles.min.css': [
                        'less/app.less'
                    ]
                },
                options: {
                    compress: false,
                    // LESS source map
                    // To enable, set sourceMap to true and update sourceMapRootpath based on your install
                    sourceMap: true,
                    sourceMapFilename: 'css/styles.min.css.map',
                    sourceMapRootpath: '/'
                }
            }
        },
        uglify: {
            dist: {
                files: {
                    'js/scripts.min.js': [
                        'vendor/bootstrap/js/transition.js',
                        'vendor/bootstrap/js/alert.js',
                        'vendor/bootstrap/js/button.js',
                        'vendor/bootstrap/js/carousel.js',
                        'vendor/bootstrap/js/collapse.js',
                        'vendor/bootstrap/js/dropdown.js',
                        'vendor/bootstrap/js/modal.js',
                        'vendor/bootstrap/js/tooltip.js',
                        'vendor/bootstrap/js/popover.js',
                        'vendor/bootstrap/js/scrollspy.js',
                        'vendor/bootstrap/js/tab.js',
                        'vendor/bootstrap/js/affix.js',
                        'vendor/*.js',
                        'js/_*.js'
                    ]
                },
                options: {
                    // JS source map: to enable, uncomment the lines below and update sourceMappingURL based on your install
                    // sourceMap: 'assets/js/scripts.min.js.map',
                    // sourceMappingURL: '/app/themes/roots/assets/js/scripts.min.js.map'
                }
            }
        },
        watch: {
            less: {
                files: [
                    'less/*.less',
                    'less/bootstrap/*.less'
                ],
                tasks: ['less:dev']
            },
            js: {
                files: [
                    '<%= jshint.all %>'
                ],
                tasks: ['jshint', 'uglify']
            },
            livereload: {
                // Browser live reloading
                // https://github.com/gruntjs/grunt-contrib-watch#live-reloading
                options: {
                    livereload: true
                },
                files: [
                    '_site/*'
                ]
            }
        },
        clean: {
            dist: [
                'css/styles.min.css',
                'css/styles.min.css.map',
                'js/scripts.min.js',
                '_site/*'
            ]
        },
        jekyll: {                             // Task
            options: {                          // Universal options
                bundleExec: true,
                src : '<%= app %>'
            },
            dist: {                             // Target
                options: {                        // Target options
                    dest: '<%= dist %>',
                    config: '_config.yml'
                }
            },
            serve: {                            // Another target
                options: {
                    serve: true,
                    drafts: true
                }
            }
        },
        connect: {
            server: {
                options: {
                    keepalive: true
                }
            }
        }
    });

    // Load tasks
    grunt.loadNpmTasks('grunt-contrib-clean');
    grunt.loadNpmTasks('grunt-contrib-jshint');
    grunt.loadNpmTasks('grunt-contrib-uglify');
    grunt.loadNpmTasks('grunt-contrib-watch');
    grunt.loadNpmTasks('grunt-contrib-less');
    grunt.loadNpmTasks('grunt-jekyll');
    grunt.loadNpmTasks('grunt-contrib-connect');

    // Register tasks
    grunt.registerTask('default', [
        'clean',
        'less:dist',
        'uglify',
        'jekyll:dist'
    ]);
    grunt.registerTask('dev', [
        'watch'
    ]);

};

【问题讨论】:

    标签: javascript gruntjs jekyll grunt-contrib-watch


    【解决方案1】:

    我花了 2 天时间拼命尝试我在互联网上可以找到的每个 gruntfile-configuration。从来没有工作过。然后我找到了这个https://stackoverflow.com/a/24765175/1541141。 使用grunt-contrib-connect,而不是grunt-connectgrunt-connect 正在阻止... 希望对您有所帮助。

    【讨论】:

      【解决方案2】:

      您需要使用“base”选项告诉 connect 要在配置中提供哪个目录,在这种情况下,它将是静态 _site 目录。您也可以将端口更改为您想要的任何端口,但最终以我的示例导航到 localhost:9009

      connect: {
        server: {
          options: {
            livereload: true,
            base: '_site/',
            port: 9009
          }
        }
      }
      

      当您更改 html 模板时,您还需要添加一个监视任务。这样的事情会奏效。

      watch: {
        html: {
          files: ['**/*.html', '!_site/**/*.html'],
          tasks: ['jekyll:dist']
        }
      }
      

      然后像 Wallace 建议的那样创建一个“发球”任务。

      // Start web server
      grunt.registerTask('serve', [
      'jekyll:dist',
      'connect:server',
      'watch'
      ]);
      

      最后在命令行中运行“grunt serve”并使用您指定的端口导航到 localhost。


      @jiggy 评论

      关键的变化是不将keepalive设置为true。 Keepalive 会阻塞 所有后续任务都不再运行。只要连接后跟 注意服务器不会终止。

      【讨论】:

      • 谢谢,我不知道 connect 和 watch 可以这么容易地同时运行 :)
      • 我将捎带接受的答案,以强调关键更改是不将 keepalive 设置为 true。 Keepalive 将阻止所有后续任务运行。只要 connect 后面跟着 watch,服务器就不会终止。
      • 除了上面的配置之外,当我指定端口时,我收到一个“致命错误”通知,但它实际上并没有失败,所以可能是一个红鲱鱼。不过有一点需要注意。
      • @jiggy 你拯救了我的一天 :)
      • @jiggy 我也是 :-)
      【解决方案3】:

      我认为您的解决方案的核心是创建新任务或编辑现有任务,如下所示:

      // Start web server
      grunt.registerTask('serve', [
          'jekyll:dist',
          'connect:livereload',
          'watch'
      ]);
      

      ...您将使用$ grunt serve 运行它。 lessjshintuglifyconnect 已包含在 watch 下。

      【讨论】:

      • 记住:您可以创建任意数量的任务,并使用$ grunt &lt;task&gt; 调用它们。运行任何组合,如果一个任务依赖于另一个任务首先运行,请注意加载顺序。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-20
      • 1970-01-01
      • 1970-01-01
      • 2021-01-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多