Uglify не может разобрать поток.js

У меня раздражающая проблема, когда uglify (вызывается через grunt-usemin) не может проанализировать URL-адрес пакета с именем flow.js. Этот пакет устанавливается как зависимость от ng-flow.

URL-адрес выглядит следующим образом:

bower_components/flow.js/dist/flow.js

Когда я запускаю сборку grunt, я получаю следующую ошибку:

Warning: Unable to read "dist/public/bower_components/flow.js" file (Error code: EISDIR). Use --force to continue.

Поскольку я мало что знаю о usemin и uglify, я не могу разобраться в этом вопросе. Я предполагаю, что он ломается, когда попадает на первый «flow.js» URL-адреса. Итак, я попытался установить flow.js как поток js в моем bower.json, но, поскольку он зависит от ng-flow, он все равно будет получать flow.js при запуске обновления Bower.

Может ли кто-нибудь рассказать мне больше об этой ошибке или предложить обходной путь для переименования пакета зависимостей?

Редактировать: usemin часть Gruntfile

useminPrepare: {
  html: ['<%= yeoman.client %>/index.html'],
  options: {
    dest: '<%= yeoman.dist %>/public'
  }
},
usemin: {
  html: ['<%= yeoman.dist %>/public/{,*/}*.html'],
  css: ['<%= yeoman.dist %>/public/{,*/}*.css'],
  js: ['<%= yeoman.dist %>/public/**/*.js'],
  options: {
    assetsDirs: [
      '<%= yeoman.dist %>/public',
      '<%= yeoman.dist %>/public/assets/images'
    ],
    // This is so we update image references in our ng-templates
    patterns: {
      js: [
        [/(assets\/images\/.*?\.(?:gif|jpeg|jpg|png|webp|svg))/gm, 'Update the JS to reference our revved images']
      ]
    }
  }
}
grunt.registerTask('build', [
'clean:dist',
'injector:less', 
'concurrent:dist',
'injector',
'wiredep',
'useminPrepare',
'autoprefixer',
'ngtemplates',
'concat',
'ngAnnotate',
'copy:dist',
'cdnify',
'cssmin',
'uglify',
'rev',
'usemin']);

Для записей файл grunt создается с использованием https://github.com/DaftMonk/generator-angular-fullstack


person user3220633    schedule 10.02.2015    source источник
comment
Как выглядят соответствующие разделы вашего Gruntfile?   -  person doelleri    schedule 11.02.2015


Ответы (2)


Проблема в том, что Grunt не может отличить каталог, оканчивающийся на «.js», от файла .js.

Обходной путь будет заключаться в использовании выражения с подстановочными знаками для захвата файлов в flow.js и исключения самого каталога.

Изменить: вам нужно будет исключить flow.js как из usemin, так и из rev.

usemin: {
  html: ['<%= yeoman.dist %>/public/{,*/}*.html'],
  css: ['<%= yeoman.dist %>/public/{,*/}*.css'],
  js: {
    src: ['<%= yeoman.dist %>/public/{,*/}*.js', '!<%= yeoman.dist %>/public/bower_components/flow.js'],
  },
  ...

rev: {
  dist: {
    files: {
      src: [
        '<%= yeoman.dist %>/public/{,*/}*.js',
        '<%= yeoman.dist %>/public/{,*/}*.css',
        '<%= yeoman.dist %>/public/assets/images/{,*/}*.{png,jpg,jpeg,gif,webp,svg}',
        '<%= yeoman.dist %>/public/assets/fonts/*',
        '!<%= yeoman.dist %>/public/bower_components/flow.js'
      ]
    }
  }
},
person doelleri    schedule 10.02.2015
comment
К сожалению, он все еще пытается включить папку и вылетает :(. (Я пытался изменить порядок, но это не дало никакого эффекта) - person user3220633; 11.02.2015
comment
ДА! Отныне я буду звать тебя Великим Мастером! - person user3220633; 11.02.2015

Проблема в том, что Grunt не может отличить каталог, оканчивающийся на «.js», от файла .js.

Это неправильное утверждение. Grunt использует minimatch lib для настройки поиска файлов, и есть фильтр isFile, для которого можно установить значение true, чтобы искать только файлы. См. grunt.file.expand

Перейдя по этой ссылке, вы найдете пример с filter: 'isFile'.

Кстати, вам следует перейти на usemin v3, так как эта проблема, кажется, решена, как вы можете видеть в проблема №474

Вы можете увидеть мой патч здесь, где я перенес проект на usemin 3 и переключите grunt-rev на grunt-filerev.

person stefbach    schedule 25.02.2015
comment
Спасибо за эту информацию, я указал на это ребятам из angular-fullstack! - person user3220633; 25.02.2015