在具有多个子目录的大型Javascript项目上使用grunt

时间:2014-08-01 19:29:07

标签: javascript gruntjs organization

我有一个包含多个子目录的Javascript项目,每个子目录都有自己的项目。我可以为每个项目使用一个具有不同任务的大型Gruntfile,但我宁愿在每个子文件夹中都有一个Gruntfile。典型的文件结构是这个

main_folder/
    project_1
        src
            js/
        dist/
        doc/
        Gruntfile.js
        package.json
    package.json
    node_modules/

然后重复每个项目的文件结构

这是我在project_1中的Gruntfile

module.exports = function(grunt) {



    // Project configuration.
    grunt.initConfig({
        pkg: grunt.file.readJSON('package.json'),
        uglify: {
            options: {
                banner: '/*! <%= pkg.name %> <%= grunt.template.today("yyyy-mm-dd") %> */\n'
            },
            build: {
                src: 'src/<%= pkg.name %>.js',
                dest: 'build/<%= pkg.name %>.min.js'
            }
        }
    });

    // Load the plugin that provides the "uglify" task.
    grunt.loadNpmTasks('grunt-contrib-uglify');


    grunt.registerTask('default', ['uglify']);

};

它的任务比我使用的少,但错误仍然存​​在。每当我尝试运行grunt时,我都会收到错误消息Local Npm module "grunt-contrib-uglify" not found. Is it installed?,即使我已经在node_modules中安装了它。

如何指定node_modules的位置,还是必须在每个文件夹中重新安装node_modules?

2 个答案:

答案 0 :(得分:3)

如果您更明确地告诉Grunt在哪里找到您的插件,我认为您仍然可以将所有内容保存在同一个地方。例如,这里有一点我的Gruntfiles:

grunt.loadTasks tasks for tasks in grunt.file.expand '../node_modules/grunt-*/tasks'

作为旁注:我面临的选择完全相同,但做出了相反的选择:整个项目的单个Grunt文件,并从每个项目子目录创建一个符号链接。事实证明这是一种非常简单的方法,可以将事物放在一个地方,并且可以解决许多令人困惑的问题,例如你所面临的问题。

答案 1 :(得分:0)

解决此问题的另一个好方法可能是使用subgrunt。它允许您为子项目配置各种目标,并具有选项npmInstall,其中“确定将为子项目运行npm install(从而安装dev依赖项)。”