Использование grunt для объединения многих файлов из многих dirs в один переименованный файл в новый каталог

У меня есть проект Angular с потенциально большим количеством модулей. Каждый модуль имеет свой собственный каталог с подкаталогами для контроллеров, директив, служб и т.д. Что-то вроде этого:

src
|-- js
    |-- modules
        |-- moduleOne
            | module.js
            |-- controllers
                | listController.js
                | detailController.js
            |-- directives
                | listItem.js
                | summaryWidget.js
            |-- filters
            |-- services
                | moduleService.js

Моя сборка по существу объединяет и компилирует файлы из src/и помещает в dev/, затем минимизирует файлы в dev/и перемещается в prod/. Во время dev сервер указывает на папку dev/и на производстве, сервер указывает на prod/folder (также почему файлы заканчиваются на .min.js, хотя они только компилируются/конкатенации). Этот процесс работает хорошо.

В настоящее время моя задача concat захватывает все файлы в moduleOne/и создает один файл moduleOne.js в моем каталоге dev. Это то, что я хочу, но более динамично:

concat: {
    modules: {
        files: {
            "dev/js/modules/moduleOne.min.js": [
                "src/js/modules/moduleOne/*.js",
                "src/js/modules/moduleOne/**/*.js"
            ],
            "dev/js/modules/moduleTwo.min.js": [
                "src/js/modules/moduleTwo/*.js",
                "src/js/modules/moduleTwo/**/*.js"
            ]
        } 
    }
}

Проблема в том, что я должен делать это для каждого модуля, но не думаю, что мне нужно будет.

Я попытался сделать следующее, потому что это то, что я хочу сделать:

concat: {
    modules: {
        files: [{
            expand: true,
            cwd: "src/js/modules",
            src: "**/*.js",
            dest: "dev/js/modules",
            ext: ".min.js"
        }]
    }
}

Но результатом были все мои файлы и структура каталогов, перенесенные из src/в dev/. Я в основном использовал concat, чтобы сделать копию, а не полезно.

Я хотел бы сделать что-то вроде этого:

concat: {
    modules: {
        files: [{
            expand: true,
            cwd: "src/js/modules",
            src: "**/*.js",
            dest: "dev/js/modules/<foldername>.min.js",  <- how do I achieve this?
        }]
    }
}

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

Ответы

Ответ 1

Итак, я нашел ответ, который я искал.

Это сообщение SO было в основном тем же самым вопросом с хорошим ответом. К сожалению, это не получилось, когда я задавал свой вопрос, иначе вы бы не читали это.

Была небольшая настройка моих потребностей. Мне нужно было сделать это динамически для каждого модуля, а не только одного файла compile.js, поэтому мой последний код выглядит следующим образом, размещенный сразу после моего initConfig():

grunt.registerTask("prepareModules", "Finds and prepares modules for concatenation.", function() {

    // get all module directories
    grunt.file.expand("src/js/modules/*").forEach(function (dir) {

        // get the module name from the directory name
        var dirName = dir.substr(dir.lastIndexOf('/')+1);

        // get the current concat object from initConfig
        var concat = grunt.config.get('concat') || {};

        // create a subtask for each module, find all src files
        // and combine into a single js file per module
        concat[dirName] = {
            src: [dir + '/**/*.js'],
            dest: 'dev/js/modules/' + dirName + '.min.js'
        };

        // add module subtasks to the concat task in initConfig
        grunt.config.set('concat', concat);
    });
});

// the default task
grunt.registerTask("default", ["sass", "ngtemplates", "prepareModules", "concat", "uglify", "cssmin"]);

Это существенно упрощает мою concat-задачу, когда я ее вручную кодировал, но немного проще (и масштабируемости!).

concat: {
    ...
    moduleOne: {
        src: "src/js/modules/moduleOne/**/*.js",            
        dest: "dev/js/modules/moduleOne.min.js"
    },
    moduleTwo:{
        src: "src/js/modules/moduleTwo/**/*.js",
        dest: "dev/js/modules/moduleTwo.min.js"
    }
}

Еще одно отклонение, которое я сделал из сообщения SO, заключалось в том, что я решил не иметь, чтобы makeModules выполняли concat самостоятельно, когда это было сделано. Моя задача по умолчанию (в которой наблюдаются настройки для запуска во время dev) все еще выполняет всю мою обработку.

Это оставляет меня со следующей структурой, готовой для минимизации в prod/:

| dev
    | js
        | modules
            |-- moduleOne.min.js
            |-- moduleTwo.min.js