Как делиться файлами между целями Grunt? - программирование
Подтвердить что ты не робот

Как делиться файлами между целями Grunt?

My Gruntfile повторил "files" на всем протяжении, который был разделен между двумя целями, dist и dev, из тех же задач. Вот пример, содержащий только проблему Stylus:

"use strict";

module.exports = function (grunt) {
    grunt.loadNpmTasks("grunt-contrib-stylus");

    grunt.initConfig({
        stylus: {
            dist: {
                files: { "www/bundle.css": ["stylus/*.styl"] },
                options: { compress: true, linenos: false }
            },
            dev: {
                files: { "www/bundle.css": ["stylus/*.styl"] },
                options: { compress: false, linenos: true }
            }
        }
    });

    grunt.registerTask("dev", ["stylus:dev"]);
    grunt.registerTask("prod", ["stylus:prod"]);
};

Есть ли способ переместить файлы в конфигурацию уровня, поэтому мне не нужно повторять его в обеих целях?

4b9b3361

Ответ 1

Доменик, вы можете использовать переменную POJS:

"use strict";

module.exports = function (grunt) {
    grunt.loadNpmTasks("grunt-contrib-stylus");

    var stylusFiles = { "www/bundle.css": ["stylus/*.styl"] };

    grunt.initConfig({
        stylus: {
            dist: {
                files: stylusFiles,
                options: { compress: true, linenos: false }
            },
            dev: {
                files: stylusFiles,
                options: { compress: false, linenos: true }
            }
        }
    });

    grunt.registerTask("dev", ["stylus:dev"]);
    grunt.registerTask("prod", ["stylus:prod"]);
};

Или вы можете использовать шаблоны в руководстве Grunt "Настройка задач" .

"use strict";

module.exports = function (grunt) {
    grunt.loadNpmTasks("grunt-contrib-stylus");

    grunt.initConfig({
        stylus: {
            dist: {
                files: { "www/bundle.css": ["stylus/*.styl"] },
                options: { compress: true, linenos: false }
            },
            dev: {
                files: "<%= stylus.dist.files %>",
                options: { compress: false, linenos: true }
            }
        }
    });

    grunt.registerTask("dev", ["stylus:dev"]);
    grunt.registerTask("prod", ["stylus:prod"]);
};

Ответ 2

Посмотрите шаблоны: http://gruntjs.com/configuring-tasks#templates

"use strict";

module.exports = function (grunt) {
  grunt.loadNpmTasks("grunt-contrib-stylus");

  grunt.initConfig({
    stylus: {
      dist: {
        files: {
          "www/bundle.css": ["stylus/*.styl"],
        },
        options: { compress: true, linenos: false }
      },
      dev: {
        files: "<%= stylus.dist.files %>",
        options: { compress: false, linenos: true }
      }
    }
  });

  grunt.registerTask("dev", ["stylus:dev"]);
  grunt.registerTask("prod", ["stylus:prod"]);
};

Ответ 3

Вы можете передать config в grunt, я не тестировал код ниже, но он должен работать, я думаю. Я просто не использовал конфигурацию для ключей раньше, только значения. Надеюсь, это старт как минимум.

"use strict";

module.exports = function (grunt) {
  grunt.loadNpmTasks("grunt-contrib-stylus");

  var buildConfig = {
    output: "www/bundle.css",
    files: ["stylus/*.styl"],
  };

  grunt.initConfig({
    config: buildConfig,
    stylus: {
        dist: {
            files: {<%= config.output%>: <%= config.files %>},
            options: { compress: true, linenos: false }
        },
        dev: {
            files: {<%= config.output%>: <%= config.files %>},
            options: { compress: false, linenos: true }
        }
    }
  });

  grunt.registerTask("dev", ["stylus:dev"]);
  grunt.registerTask("prod", ["stylus:prod"]);
};

Ответ 4

В прошлом я подошел к этому несколько раз. Можно было бы использовать переменные окружения и использовать переменную среды для переключения простых флагов, таких как стилус. Расширяя этот подход, вы даже можете зарегистрировать задачу, которая устанавливает для вас флаг. Например.

"use strict";

var env = 'DEV';

module.exports = function (grunt) {
    grunt.loadNpmTasks("grunt-contrib-stylus");

    grunt.initConfig({
        stylus: {
            dist: {
                files: { "www/bundle.css": ["stylus/*.styl"] },
                options: { compress: env === 'PROD', linenos: env === 'DEV' }
            }
        }
    });

    grunt.registerTask('production', function () {
        env = 'PROD';
    });

    grunt.registerTask("dev", ["stylus"]);
    grunt.registerTask("prod", ["production", "dev"]);
};

Вы также можете перейти по шаблону или расширить базовый объект, но я обычно нахожу флаги достаточно простыми для работы.

Ответ 5

Вы можете просто добавить его как строку в свою конфигурацию grunt:

"use strict";

module.exports = function (grunt) {
    grunt.loadNpmTasks("grunt-contrib-stylus");

    grunt.initConfig({
        cssFiles: ["stylus/*.styl"],
        stylus: {
            dist: {
                files: { "www/bundle.css": '<%= cssFiles %>' },
                options: { compress: true, linenos: false }
            },
            dev: {
                files: { "www/bundle.css": '<%= cssFiles %>' },
                options: { compress: false, linenos: true }
            }
        }
    });

    grunt.registerTask("dev", ["stylus:dev"]);
    grunt.registerTask("prod", ["stylus:prod"]);
};

Посмотрите на файл, который я использую в одном из моих проектов, если вам нужно больше примеров: https://github.com/sugendran/cheatsheet.js/blob/master/Gruntfile.js

Ответ 6

что-то вроде этого работает...

"use strict";

module.exports = function (grunt) {

    grunt.loadNpmTasks("grunt-contrib-stylus");

    var files = { "www/bundle.css": ["stylus/*.styl"] };
    var options;

    grunt.registerTask("config", function() {
        grunt.initConfig({
            stylus: {
                main: {
                    files: files,
                    options: options
                }
            }
        });
    });

    grunt.registerTask("setup-prod", function () {
        options = { compress: false, linenos: true };
    });

    grunt.registerTask("setup-dev", function () {
        options: { compress: true, linenos: false };
    });

    grunt.registerTask("dev", ["setup-dev", "config", "stylus"]);
    grunt.registerTask("prod", ["setup-prod", "config", "stylus"]);
};

похоже, что вы также можете изменить свой конфиг без повторного вызова initConfig() путем прямого редактирования grunt.config.data.