【问题标题】:Dynamic Grunt Watch configuration动态 Grunt Watch 配置
【发布时间】:2014-10-28 22:16:32
【问题描述】:

我的站点文件结构是这样的:

app
    less
        themes
            default
            modern
            etc
public
    themes
        default
            css
        modern
            css
        etc

所以/app/less/themes/{{ themeName }}/*.less 将编译成/public/themes/{{ themeName }}/css/*.css

我已经动态设置了 Grunt Less 任务并且工作正常。 示例:grunt less:compileTheme:modern

less: {
  compileTheme: {
    options: {
      compress: false,
      yuicompress: false,
      optimization: 2,
      sourceMap: true,
      sourceMapFilename: "public/themes/<%= grunt.task.current.args[0] %>/css/styles.css.map",
      sourceMapURL: "/themes/<%= grunt.task.current.args[0] %>/css/styles.css.map"
    },
    files: {
      "public/themes/<%= grunt.task.current.args[0] %>/css/styles.css": "app/less/themes/<%= grunt.task.current.args[0] %>/styles.less"
    }
  }
}

但我不确定如何让 Grunt Watch 任务正常工作。理想情况下,它会看到主题文件夹名称并以grunt less:compileTheme:{{ themeName }} 运行 grunt 任务:

watch: {
    themeCss: {
        files: "app/less/themes/{{ themeName }}/**/*.less",
        tasks: ["less:compileTheme:{{ themeName }}"],
        options: {
          spawn: false
        }
    }
}

这可能吗?和/或我应该这样做有更好的方法吗?

【问题讨论】:

    标签: javascript css gruntjs grunt-contrib-watch grunt-contrib-less


    【解决方案1】:

    编辑您的监视任务以运行不带主题名称的less:compileTheme-任务,并监视主题文件夹中的所有较少文件:

    watch: {
        themeCss: {
            files: "app/less/themes/**/*.less",
            tasks: ["less:compileTheme"],
            options: {
              spawn: false
            }
        }
    }
    

    现在您可以添加一个监视事件处理程序来获取更改的文件。提取themeName,并配置你的less-task:

    grunt.event.on('watch', function(action, filepath) {
      var themeName = filepath.split('/')[3];
      grunt.config('less.compileTheme.files', {
        "public/themes/" + themeName + "/css/styles.css": "app/less/themes/" + themeName + "/styles.less"
      });
    });
    

    当然,你的 themeName 的检测应该更可靠,但我想你知道如何进行动态观看!

    【讨论】:

    • 谢谢。我收到一个错误:在第一个“+ themeName +”处出现“Unexpected token '+'” 我尝试将对象设为字符串,但这也不起作用。
    • 没关系,我很笨。这是标准的 JS,你不能像这样将对象属性作为变量。所以我只需要使用 obj[prop] = val;符号,一切都很好。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-25
    • 2023-03-21
    • 2016-06-19
    • 2013-05-09
    相关资源
    最近更新 更多