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

Как переименовать файлы с помощью Grunt на основе имени родительской папки соответствующего файла?

У меня есть следующая структура:

src/
    modules/
        module1/
            js/
                main.js
            scss/
                main.scss
            index.html
        module2/
            js/
                main.js
            scss/
                main.scss
            index.html

Я хотел бы запустить задачу grunt, чтобы скопировать их в следующую структуру:

dev/
    js/
        module1.js
        module2.js
    css/
        module1.css
        module2.css
    module1.html
    module2.html

Есть ли способ сделать это с существующим плагином grunt? Если нет, как я могу это достичь?

4b9b3361

Ответ 1

Это можно сделать с помощью плагина grunt-contrib-copy.

Главное отметить, что вы можете изменить назначение программным путем с помощью функции переименования (которая берет в пункт назначения и источник каждого файла).

Вот (несколько хрупкий) образец Gruntfile.js, который должен скопировать в желаемую структуру:

module.exports = function(grunt) {
  // Project configuration.
  grunt.initConfig({
    copy: {
      main: {
        files: [
          {
            expand: true, 
            cwd: 'src/modules/', 
            src: ['**/*.js'], 
            dest: 'dev/js/', 
            rename: function(dest, src) {
              // use the source directory to create the file
              // example with your directory structure
              //   dest = 'dev/js/'
              //   src = 'module1/js/main.js'
              return dest + src.substring(0, src.indexOf('/')) + '.js';
            }
          },
          {
            expand: true, 
            cwd: 'src/modules/', 
            src: ['**/*.scss'], 
            dest: 'dev/css/', 
            rename: function(dest, src) {
              return dest + src.substring(0, src.indexOf('/')) + '.css';
            }
          },
          {
            expand: true, 
            cwd: 'src/modules/', 
            src: ['**/*.html'], 
            dest: 'dev/', 
            rename: function(dest, src) {
              return dest + src.substring(0, src.indexOf('/')) + '.html';
            }
          }
        ]
      }
    }
  });

  grunt.loadNpmTasks('grunt-contrib-copy');

  // Default task(s).
  grunt.registerTask('default', ['copy']);
};

Ответ 2

Нет необходимости использовать grunt-contrib-copy только для этого, теперь вы можете воспользоваться grunt.file.expandMapping, у которого есть опции, чтобы просто изменить расширение файла или определить функцию, которая возвращает имя выходного файла.

Вот пример объекта files в задаче jade для компиляции шаблонов .jade в .html файлы:

files: [{
    expand: true, 
    src: "**/*.jade", 
    dest: "<%= distDir %>", 
    cwd: "<%= assetsDir %>/jade", 
    rename: function(dest, matchedSrcPath, options) {
        // return the destination path and filename:
        return (dest + matchedSrcPath).replace('.jade', '.html');
    }
}]

В этом случае было бы проще использовать параметр ext: '.html' вместо опции rename, но я использую rename здесь, чтобы вы могли видеть, как это работает.

Подробнее о параметрах ext и rename (и других) в файлах grunt.file. Еще несколько примеров здесь и здесь.

Ответ 3

Вы можете просто использовать параметры: expand: true, flatten: true

Нет необходимости в пользовательских обратных вызовах переименования.

Ответ 4

Не совсем ответ на ваш вопрос, но я сделал его здесь для поиска относительных dest-папок с хрюканьем, поэтому... Вот как я его решил

...
base: {
  files:
  [
    {
      expand: true,
      cwd: 'app/design/frontend/',
      src: ['**/Magento_Sales/email-src/*.html'],
      dest: '../../Magento_Sales/email/',
      rename: function(dest, src, expand) {
        src = path.parse(src)
        return path.join(expand.cwd, src.dir, dest, src.base);
      }
    },
  ],
}
...

Этот маленький бит path.join(expand.cwd, src.dir, dest, src.base); просто создает путь, который мне нужен.

expand.cwd = app/design/frontend/

src.dir = <DYNAMIC_FOLDERS>/Magento_Sales/email-src/

dest = ../../Magento_Sales/email/

src.base = <FILE>.html

и все вместе = = app/design/frontend/<COMPANY>/<MAIN-THEME>/Magento_Sales/email/<FILE>.html

и в моей ситуации он теперь скомпилирует мои html-письма в относительных папках назначения