Grunt loop для задачи копирования, но копирование только последнего файла - PullRequest
0 голосов
/ 10 мая 2018

Можете ли вы помочь мне с этой проблемой?

Я пытаюсь создать функцию в Gruntfile.js для копирования файлов шаблонов в мой проект с использованием цикла и файла .json для "автоматизации" копированиязадание, видимо, функция выглядит великолепно, потому что Grunt запускает задание копирования в соответствии с количеством записей в файле .json, используя grunt.log.write в цикле Grunt показывает имена файлов .json, но в действительности он только копируетпоследний зарегистрированный файл.

Первый мой .json файл:

{
    "config": {
        "modules": [
            {"name": "footer", "number": 2},
            {"name": "header", "number": 1}
        ]
    }
}

Вторая моя задача копирования с переменными цикла:

copy: {
    core: {
        files: [{
            expand: true,
            cwd: "core/<%=grunt.option('coreName')%>/<%=grunt.option('coreNumber')%>/",
            src: "**",
            dest: "../sass/2_deploy/core/"
        }]
    }
}

Намерение было получитьфайл внутри каталога версий «header / 1 /», «footer / 2 /» и перенос в каталог deploy в соответствии с приведенным выше кодом.

В-третьих, здесь есть функция, которая читает .json файл и объявляет переменные и выполняет задачу внутри цикла:

function moveCoreFiles() {
    var models = require('./variables.json');
    var cores = models.config.modules;
    for (core in cores) {
        grunt.option('coreName', cores[core].name);
        grunt.option('coreNumber', cores[core].number);
        grunt.task.run('copy:core');
        grunt.log.write(grunt.option("coreName"));
    }
}
// ... enter code here
grunt.registerTask('moveCore', moveCoreFiles);

В этот момент, при выполнении задачи, Grunt возвращает эту информацию:

$ grunt moveCore
Running "moveCore" task
footerheader
Running "copy:core" (copy) task
Copied 1 file

Running "copy:core" (copy) task
Copied 1 file

Из описания тСпросите, кажется, что Grunt выполнил задачу один для каждой записи дважды, но на практике он только переместил последний «заголовочный» файл в каталог, мой вопрос был бы, если этот тип действия действительно возможен, или если я должен отказаться от цикла внутриGruntfile.

Большое спасибо за помощь!Привет! * * 1030

Ответы [ 2 ]

0 голосов
/ 10 мая 2018

Вы можете динамически настроить Задачи target (т.е. copy:core) с помощью отдельной Пользовательской Задачи .

В приведенном ниже примере Gruntfile.js мы динамически настраиваемцель copy:core на основе каждой записи в массиве modules в variables.json перед запуском задачи.Это выполняется задачей configCopyCoreAndRun.

Gruntfile.js

module.exports = function (grunt) {

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

  grunt.initConfig({
    copy: {
      // <-- `core` target is intentionally not defined. It will be
      //      configured, set, and run by configCopyCoreAndRun task.  
      anotherTarget: {
        src: './variables.json',
        dest: '../sass/2_deploy/'
      }
    }
  });

  /**
   * Custom Helper function dynamically configures the `core` target in
   * `copy` task, based on data entered in an external `.json` file.
   */
  grunt.registerTask('configCopyCoreAndRun', function() {
    var modules = grunt.file.readJSON('./variables.json').config.modules;
    var core = {files: []};

    modules.forEach(function(module) {
      core.files.push({
        expand: true,
        cwd: 'core/' + module.name + '/' + module.number,
        src: '**',
        dest: '../sass/2_deploy/core/'
      })
    });

    grunt.config.set('copy.core', core);
    grunt.task.run('copy:core');
  });

  // We call `configCopyAndRun` then `copy:anotherTask` to demonstrate
  // that other copy target(s) can also exist and be used.
  grunt.registerTask('default', ['configCopyCoreAndRun', 'copy:anotherTarget']);
};

Примечание:

Чтобы избежать возможности перезаписи файлов (с одинаковыми именами) при копировании нескольких ресурсов в каталог dest (т. Е. ../sass/2_deploy/core/), вы можете рассмотреть возможность изменения этой строки в Grunfile.js выше:

dest: '../sass/2_deploy/core/'

примерно так:

dest: '../sass/2_deploy/core/' + module.name + '/' + module.number

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

0 голосов
/ 10 мая 2018

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

Сначала вы определяете функцию, которая будет создавать массив файлов для копирования:

function getFiles() {
    var models = require('./variables.json');
    var cores = models.config.modules;
    var files = [];
    for (var core in cores) {
        files.push({
            expand: true,
            cwd: "core/" + cores[core].name + "/" + cores[core].number + "/",
            src: "**",
            dest: "../sass/2_deploy/core/"
        });
        grunt.log.write("core/" + cores[core].name + "/" + cores[core].number + "/\r\n");
    }
    return files;
}

Затем задайте задачу copy для использования массива файлов:

grunt.initConfig({
    copy: {
        core: {
            files: getFiles()
        }
    }
});

Тогда просто определите задачу:

grunt.registerTask('default', ['copy:core']);

Получившийся Gruntfile.js будет выглядеть следующим образом:

module.exports = function(grunt) {

    function getFiles() {
        var models = require('./variables.json');
        var cores = models.config.modules;
        var files = [];
        for (var core in cores) {
            files.push({
                expand: true,
                cwd: "core/" + cores[core].name + "/" + cores[core].number + "/",
                src: "**",
                dest: "../sass/2_deploy/core/"
            });
            grunt.log.write("core/" + cores[core].name + "/" + cores[core].number + "/\r\n");
        }
        return files;
    }

    grunt.initConfig({
        copy: {
            core: {
                files: getFiles()
            }
        }
    });

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

    grunt.registerTask('default', ['copy:core']);

};

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

...