Как делиться файлами между целями 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"]);
};
Есть ли способ переместить файлы в конфигурацию уровня, поэтому мне не нужно повторять его в обеих целях?
Ответы
Ответ 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.