Я использую VS2015 с задачей grunt, чтобы получить все файлы java-скриптов в моем проекте и записать их в свой шаблон index.html перед сборкой. Проблема в том, что файлы зависят друг от друга. Например, мне нужно создать скрипт src= '' до angular.js перед ui-bootstrap-tpls.js, иначе я получу ошибки Reference. Задача подстановки индекса src получает файлы в "порядке", и это не тот, который работает для графика зависимостей. Есть ли способ настроить этот порядок, не выписывая каждый подкаталог по отдельности и не побеждая цель этой задачи grunt grunt при добавлении новых зависимостей в будущем (т.е. мне не нужно добавлять новые каталоги)?
У меня зарегистрирована индексная задача (с подстановочным кодом):
index: {
dev: {
dir: '<%= wwwroot_dir %>',
src: [
'<%= build_dir %>/wwwroot/**/*.js',
]
Затем у меня много задач:
grunt.registerMultiTask('index', 'Process index.html template', function () {
var dirRE = new RegExp('^(' + grunt.config('build_dir') + '/' + grunt.config('wwwroot_dir')
+ '|' + grunt.config('compile_dir') + '/' + grunt.config('wwwroot_dir')
+ '|' + grunt.config('build_dir')
+ '|' + grunt.config('compile_dir')
+ ')\/', 'g');
var jsFiles = filterForJS(this.filesSrc).map(function (file) {
return file.replace(dirRE, '');
});
var cssFiles = filterForCSS(this.filesSrc).map(function (file) {
return file.replace(dirRE, '');
});
var sourcePath = userConfig.app_files.htmltemplate;
grunt.file.copy(sourcePath, this.data.dir + '/index.html', {
process: function (contents, path) {
return grunt.template.process(contents, {
data: {
scripts: jsFiles,
styles: cssFiles,
version: grunt.config('pkg.version')
}
});
}
});
});
Пример index.html
<html data-ng-app="app" data-ng-controller="AppCtrl" ng-init="">
<head>
<title data-ng-bind="pageTitle">MY APP</title>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no">
<!-- compiled CSS --><% styles.forEach( function ( file ) { %>
<link rel="stylesheet" type="text/css" href="<%= file %>" />
<% }); %>
<!-- compiled JavaScript --><% scripts.forEach( function ( file ) { %>
<script type="text/javascript" src="<%= file %>"></script>
<% }); %>
</head>
<body>
<div data-ui-view></div>
</body>
</html>
Определены примеры каталогов (которые я хочу избежать, если это возможно):
index: {
dev: {
dir: '<%= wwwroot_dir %>',
src: [
'<%= wwwroot_dir %>/lib/angular/*.js',
'<%= wwwroot_dir %>/lib/angular-bootstrap/*.js',
....etc
]
После небольшого поиска я нашел следующее на gruntjs.com
Кроме того, для упрощения других сложных шаблонов глобусов Grunt позволяет указать массивы путей к файлам или шаблонов глобусов. Шаблоны обрабатываются в порядке, с!! -prefixed соответствует исключению согласованных файлов из набора результатов. Результирующий набор уникален.
Поскольку файлы уникальны, я включил более важные зависимости сверху, а затем использовал подстановочный знак впоследствии. Уникальность, похоже, удалила второй экземпляр, а не первый, который работает.
index: {
dev: {
dir: '<%= wwwroot_dir %>',
src: [
'<%= wwwroot_dir %>/lib/jquery/dist/*.js',
'<%= wwwroot_dir %>/lib/angular/*.js',
'<%= wwwroot_dir %>/lib/**/*.js',
]
}