Подтвердить что ты не робот

Настройка сопоставления имени файла Grunt для файлов с несколькими точками

Я только начал использовать хрюканье и люблю его. Я продолжаю сталкиваться с проблемой, которая, похоже, может быть довольно распространенной. Вот. У меня есть файлы, названные так, чтобы слова после точки были чем-то вроде классов. например:

layout.coffee
layout.blog.coffee
layout.site.coffee

Моя задача grunt настроена на просмотр этих файлов и переводит их в js следующим образом:

coffee:
  dev:
    files: [
      expand: true
      cwd: "<%= yeoman.app %>"
      src: ["**/*.coffee"]
      dest: "<%= yeoman.dev %>"
      ext: ".js"
    ]

Проблема, я думаю, заключается в том, что использование ext делает цель для всех трех файлов. coffee целевым файлом layout.js, который не является намерением.

Есть ли хороший способ настройки сопоставления файлов grunt для имен файлов с несколькими точками?

Сейчас я должен изменить свое соглашение об именах, чтобы использовать - вместо ., что является перетаскиванием: (

4b9b3361

Ответ 1

Взгляните на раздел "Создание динамического объекта" раздела Настройка задач.

Вместо указания ext вы можете указать rename, которая является функцией, которая позволяет создавать собственное сопоставление для имен файлов.

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

Надеюсь, что вам поможет!

Ответ 2

Обратите внимание, что существует еще одна опция "extDot", которую вы можете использовать, чтобы указать, после какой точки должен применяться внешний (первый или последний):

например.

files: [{
  expand: true,
  src: ['*.js','!*min.js'],
  dest: 'js',
  cwd: 'js',
  ext: '.min.js',
  extDot: 'last'
}]

Ответ 3

Что обходной путь, который я использую в своих проектах:

uglify  : {
  build : {
    src     : ['**/*.js', '!*.min.js'],
    cwd     : 'js/',
    dest    : 'js/',
    expand  : true,
    rename  : function (dest, src) {
      var folder    = src.substring(0, src.lastIndexOf('/'));
      var filename  = src.substring(src.lastIndexOf('/'), src.length);

      filename  = filename.substring(0, filename.lastIndexOf('.'));

      return dest + folder + filename + '.min.js';
    }
  }
}

Когда имя файла похоже на jquery.2.0.3.js, после того, как оно будет указано, будет jquery.2.0.3.min.js.

Ответ 4

Используйте extDot вместо ext:

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

то есть.

/path/to/module.somename.scss -> /path/to/module.somename.css

Пример:

files: [{
  expand: true,
  src: ['public_html/**/*.scss'],
  extDot: 'first',
  rename  : function (dest, src) {

    var _new_ext = 'css';

    //Get src filename
    src = src.split("/");
    var filename = src.pop();

    //Apply new extension to filename
    var arr  = filename.split(".");
    arr.pop();
    arr.push(_new_ext);
    filename = arr.join(".");

    dest = dest || src.join("/");

    return dest + '/' + filename;
  }
}]

Gist: https://gist.github.com/tecfu/f84a65ffa850a0bc2e88