Grunt - возможно ли передавать глобальные пользовательские функции внешним задачам, которые были загружены grunt.loadTasks? - PullRequest
0 голосов
/ 09 января 2020

У меня есть пользовательские функции, которые хорошо работают, когда задачи определены в том же файле gruntfile. js, но в моем файле gruntfile. js теперь содержит более 2000 строк, и его становится сложно поддерживать. Можно ли использовать функции глобально, не определяя их снова в каждом файле задачи? Когда они вызываются из внешней задачи, ни одна из двух функций не работает. Я просто получаю функцию ошибки, не определенную.

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

gruntfile.js

grunt/tasks/functions.js

grunt/tasks/styles.js

Содержимое файлов выглядит следующим образом:

gruntfile. js

module.exports = function(grunt) {
    require('jit-grunt')(grunt)

    function globalFunctionOne(param1) {
       console.log('yay it works from main file');
    }

    grunt.initConfig({});

    console.log(grunt.config());

    grunt.loadTasks('grunt/tasks')

    grunt.registerTask('default', ['sass:dist'];
}

функций. js

module.exports = function(grunt) {
    function globalFunctionTwo(param1) {
        console.log('yay it works from partial file');
    }
}

стилей. js

module.exports = function(grunt) {
    grunt.config('sass', {
        options: {
            implementation: sass,
            includePaths: globalFunctionOne('dev'),
            outputStyle: 'expanded',
            sourceMap: true
        },
        dist: {
            files: {
                globalFunctionTwo('dist'),
            }
        }
    });
}

1 Ответ

0 голосов
/ 11 марта 2020

2000 строк? Это длинный gruntfile. Вот grunt-файл, который вы можете использовать, чтобы разбить ваш код на что-то более модульное:

gruntfile. js

function init(grunt) {
    "use strict";
    function loadConfig(pattern) {
        let config = {},
            fileName,
            fileData;

        grunt.file.expand(pattern).forEach(function (filePath) {
            fileName = filePath.split('/').pop().split('.')[0];
            fileData = require('./' + filePath)(grunt);
            config[fileName] = fileData;
        });

        return config;
    }

    function loadGrunt() {
        const config = {
            pkg: grunt.file.readJSON('package.json')
        };

        require('load-grunt-tasks')(grunt);

        if (grunt.file.exists('grunt/tasks')) {
            grunt.log.writeln('task directory found, loading tasks...');
            grunt.loadTasks('grunt/tasks');
        }

        grunt.util._.extend(config, loadConfig('grunt/configs/**/*.js'));

        grunt.initConfig(config);
    }
    loadGrunt();

}

module.exports = init;

Что делает этот gruntfile:

  • Он динамически создает объект конфигурации для использования grunt, загружая каждый файл .js, который он находит в project-root/grunt/configs. Имя каждого файла соответствует его ключу для объекта конфигурации grunt.
  • Он динамически загружает любые задачи из project-root/grunt/tasks

Если ваша конфигурация использует grunt-contrib-copy, то в вашем Project, у вас будет файл конфигурации, похожий на следующий:

project-root / grunt / configs / copy. js

module.exports = function (grunt) {
    "use strict";
    return {
        base: {
            options: {
                process: function (content) {
                    return grunt.template.process(content);
                }
            },
            src: 'grunt/templates/base.url.js',
            dest: 'www/source/config/base.url.js'
        },
        pluginManifest: {
            src: 'cordova/template/package.json',
            dest: '<%= grunt.task.current.args[0] %>/package.json'
        },
        splashScreens: {
            expand: true,
            cwd:"grunt/templates/",
            src: "screen/**",
            dest: '<%= create.dest %>/res/'
        }
    };
};

Вы можете затем сдвиньте ваши глобальные функции в файл helpers javascript и импортируйте их в конфиги в типичном Node.js стиле:

project-root / grunt / configs / sass. js

module.exports = function (grunt) {
  const helpers = require("../helpers.js)(grunt);
  return {
    options: {
      implementation: sass,
      includePaths: helpers.globalFunctionOne('dev'),
      outputStyle: 'expanded',
      sourceMap: true
    },
    dist: {
      files: {
        globalFunctionTwo('dist'),
      }
    }
  };
};

Project-root / grunt / helpers. js

module.exports = function (grunt) {
  function globalFunctionOne(param1) {
    console.log('yay it works from main file');
  }

  function globalFunctionTwo(param1) {
    console.log('yay it works from partial file');
  }

  return {
    globalFunctionOne,
    globalFunctionTwo
  }; 
};
...