Използване на grunt за свързване на много файлове от много директории в един преименуван файл в нова директория

Имам 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/ (също защо файловете завършват на .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?
        }]
    }
}

Четох много, но изглежда, че се доближавам само до намирането на отговора и имам проблеми с обединяването на концепциите. Голяма част от това, което намирам, са само единични файлове в нова директория с преименуване. Бих искал няколко файла в един файл в нова директория с преименуване. Защото така се въртя :)


person coblr    schedule 20.02.2014    source източник


Отговори (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, беше, че избрах да не накарам подготвителни модули да изпълняват concat самостоятелно, когато беше готово. Моята задача по подразбиране (кой часовник е настроен да работи по време на разработка) все още извършва цялата ми обработка.

Това ме оставя със следната структура, готова за минимизиране в prod/:

| dev
    | js
        | modules
            |-- moduleOne.min.js
            |-- moduleTwo.min.js
person coblr    schedule 20.02.2014
comment
възможно ли е да се изключат подпапки? - person pcnate; 22.02.2017
comment
Вероятно и се обзалагам, че можете да го разберете ;). Не го изисквах, когато използвах grunt, и просто използвах gulp скоро след този пост. - person coblr; 22.02.2017