【问题标题】:Grunt dynamic dest location sassGrunt 动态 dest 位置 sass
【发布时间】:2016-06-19 16:37:16
【问题描述】:

这可能是一个重复的问题,但我无法找到满足我要求的解决方案

我正在尝试创建一个可以在动态位置生成 css 文件的 sass grunt 任务。这是我的结构

/成分 --> xyz --> scss --> xyz.a.scss --> xyz.b.scss --> abc --> scss --> abc.a.scss --> abc.b.scss

grunt 任务能否创建一个相对于其组件的新文件夹,即

/成分 --> xyz --> scss --> xyz.a.scss --> xyz.b.scss --> CSS --> xyz.a.css --> xyz.b.css --> abc --> scss --> abc.a.scss --> abc.b.scss --> CSS --> abc.a.css --> abc.b.css

我当前的 SASS 任务,在 SCSS 的同一文件夹中生成 CSS 文件

sass: {
     dist: {
          files: [{
            expand: true,
            cwd: '<%= yeoman.client %>/components/',
            src: ['**/*.scss'],
            dest: '<%= yeoman.client %>/components/',
            extDot: 'last',
            ext: '.css'
          }]
     }
},

我知道我们可以通过在 dest 中提供组件文件夹名称来实现这一点,例如对于 xyz 组件,我可以将 dest 用作 /components/xyz/css。但我将不得不为每个组件编写单独的任务。有没有办法在不实际指定文件夹名称的情况下将 dest 保存在同一个父文件夹中?即 src:['**/scss/*.scss'] 和 dest be:['**/css/'] 有没有办法做到这一点?

【问题讨论】:

  • 澄清一下,[编辑]您有一个 sass 文件,并且您希望将其处理到每个项目的不同位置?你运行一次,它会将 CSS 输出到哪里?一次所有项目?我不明白你想要完成的事情背后的后勤或原因。
  • 对不起,如果我的问题不够清楚。忽略项目的事情,我已经编辑了这个问题。希望这是有道理的。
  • 据我所知,我认为您的样式(组件 > 文件夹 > css | scss > 文件)有四级层次结构。您想知道 Grunt 是否可以命名二级容器文件夹并通过您的所有组件对其进行递归?好像你有一个项目架构问题。如果每个组件只有一个 scss 文件,则根本不需要这个 2 级文件夹。只需将所有 scss 组件放在一个文件夹中,然后将它们输出到 CSS 文件夹即可。也许我错过了什么......
  • 您的要求完全正确@staypuftman 我可以添加的唯一其他细节是每个组件中有多个 scss 文件。

标签: css sass gruntjs yeoman grunt-contrib-sass


【解决方案1】:

可以使用动态参数传入任务:

例如:

grunt sass:xyz

比在代码中你可以使用这样的东西:

sass: {
 dist: {
      files: [{
        expand: true,
        cwd: '<%= yeoman.client %>/components/',
        src: ['**/<%= grunt.task.current.args[0] %>/sass/*.scss'],
        dest: '<%= yeoman.client %>/components/<%= grunt.task.current.args[0] %>/css',
        extDot: 'last',
        ext: '.css'
      }]
 }
},

您必须设置的唯一内容是为所有组件执行它的通用任务,例如:

grunt.registerTask('sassAll', [ 'sass:xyz', 'sass:abc' ]);

您甚至可以生成一个数组并循环它:

grunt.registerTask('sassAll', function() {
    gruntUtils.sassTasks.forEach(function(param){
        grunt.task.run('sass:' + param);
    });
});

var gruntUtils = {
    sassTasks : [ 'xyz', 'abc' ]
};

您可以使用更多参数来设置 dest 和 source:

grunt sass:xyz/sass:xyz/css

并引用第二个参数:

<%= grunt.task.current.args[1] %>

我找到了一种方法来检索基础目录中的目录(不是子目录):

var templates = grunt.file.expand({
                filter: "isDirectory", 
                cwd: "(your base dir path in relation to the gruntfile.js)/components"
                },["*"]);

var dirs = templates.map(function (t) {
    return t;
});

比你有一个数组(dirs)来代替[ 'xyz', 'abc' ]

【讨论】:

  • 感谢您的解决方案。我想它已经接近了,但是我们仍然需要提供组件文件夹名称。整个目的是避免使用组件文件夹名称
  • 解释了一种以自主方式获取目录的方法,但我不知道是否有可能在不编辑插件代码的情况下做你想做的事。在任何情况下,您都不必自己写文件夹名称,您只需要一项任务!
  • 我想我得到了我需要的东西。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-15
  • 2016-01-02
相关资源
最近更新 更多