17

是否可以通过在中心点上拥有所需模块的方式来配置 grunt?

我有以下项目结构

-Project
-- subproject
-- subproject
-- subproject

我通过 grunt 构建所有子项目的项目,我也可以为自己构建每个子项目。目前我有一个 Gruntfile.js、package.json 和文件夹 node_modules (~50mb),其中包含每个子项目和根级别的所有必需模块。

那么是否可以将 node_modules 文件夹仅放在一个级别上,例如在根级别上,而子项目在根级别上引用 node_modules?

-Project
--subproject
--subproject
--subproject
--node_modules

有没有办法通过 package.json 或其他方式引用 node_module 文件夹?

编辑:

Gruntfile.js(子项目级别)

/*global module:false */
/*jshint node:true */

module.exports = function(grunt) {

    "use strict";

    // ================================================================================
    // project configuration
    // ================================================================================
    grunt.initConfig({
        pkg : grunt.file.readJSON('package.json'),
        jshint: {
            globals : {
                d3:true,
                Modernizr:true,
                tempo:true
            },
            options: grunt.file.readJSON('.jshintrc')
        },
        csslint: {
            subproject: {
                src: 'css/**/*.css'
            }
        },
        htmllint : {
            subproject: {
                src: 'html/**/*.html'
            }
        },
        clean : [ 'output' ],
        less : {
            options: {
                paths: ['./']
            },
            src: {
                expand: true,
                cwd:    'css/',
                src:    ['**/*.less'],
                dest:   'css/',
                ext:    '.css'
            }
        },
        copy: {
            subproject: {
                files: [
                    {src: ['img/**', 'js/**', 'folderX/**','!**/*.less'], dest: 'output/subproject/'}
                ]
            }
        }
    });

    grunt.loadNpmTasks('grunt-contrib-clean');
    grunt.loadNpmTasks('grunt-contrib-jshint');
    grunt.loadNpmTasks('grunt-html');
    grunt.loadNpmTasks('grunt-css');
    grunt.loadNpmTasks('grunt-contrib-less');
    grunt.loadNpmTasks('grunt-contrib-copy');

    // ================================================================================
    // default task
    // ================================================================================
    grunt.registerTask('default', ['clean', 'less', 'csslint', 'htmllint', 'copy']);
};

package.json(子项目级别)

{
    "description": "subproject", 
    "title": "Lorem Ipsum", 
    "devDependencies": {
        "grunt-contrib-watch": "~0.2.0", 
        "grunt-contrib-jshint": "~0.1.1", 
        "grunt-contrib-less": "~0.5.0", 
        "grunt-contrib-uglify": "~0.1.1", 
        "grunt-contrib-copy": "~0.4.0", 
        "grunt-contrib-qunit": "~0.1.1", 
        "grunt-css": "~0.5.4", 
        "grunt-contrib-clean": "~0.4.0", 
        "grunt-html": "~0.3.3", 
        "grunt-contrib-concat": "~0.1.3"
    }
}

BR,迈贝克

4

4 回答 4

6

这是开箱即用的。 在当前目录及其所有父目录中查找,然后在全局位置中查找npmnode_modules

所以你甚至可以这样做:

-Project
--subproject1
---node_modules
--subproject2
--subproject3
--node_modules

subproject1将可以访问内部的所有 npmsProject/subproject1/node_modulesProject/node_modules,而subproject2并且subproject3只会找到内部的那些Project/node_modules

更新

有一个很少记录的功能称为 grunt 集合。它需要一些设置,但您不需要每个子项目中所有 grunt 插件的副本。

这是文件布局

-Project
--subproject1
---node_modules
----grunt-collection
-----package.json
--subproject2
...
--subproject3
...
--node_modules
---grunt
---grunt-contrib-concat
---grunt-contrib-jshint
---grunt-contrib-qunit
---grunt-contrib-watch
---grunt-html
---grunt-contrib-clean
---grunt-contrib-copy
---grunt-contrib-less
---grunt-contrib-uglify
---grunt-css
--package.json

项目/package.json

{
    "description": "subproject", 
    "version": "0.0.0",
    "name": "Lorem",
    "title": "Lorem Ipsum", 
    "devDependencies": {
        "grunt": "*",
        "grunt-contrib-watch": "~0.2.0", 
        "grunt-contrib-jshint": "~0.1.1", 
        "grunt-contrib-less": "~0.5.0", 
        "grunt-contrib-uglify": "~0.1.1", 
        "grunt-contrib-copy": "~0.4.0", 
        "grunt-contrib-qunit": "~0.1.1", 
        "grunt-css": "~0.5.4", 
        "grunt-contrib-clean": "~0.4.0", 
        "grunt-html": "~0.3.3", 
        "grunt-contrib-concat": "~0.1.3"
    }
}

项目/子项目1/package.json

{
    "description": "subproject", 
    "version": "0.0.0",
    "name": "Lorem",
    "title": "Lorem Ipsum", 
    "devDependencies": {
    }
}

Project/subproject1/Gruntfile.js摘录(你只需要 grunt-collection 任务)。

grunt.loadNpmTasks('grunt-collection');
// grunt.loadNpmTasks('grunt-contrib-jshint');
// grunt.loadNpmTasks('grunt-html');
// grunt.loadNpmTasks('grunt-css');
// grunt.loadNpmTasks('grunt-contrib-less');
// grunt.loadNpmTasks('grunt-contrib-copy');

项目/子项目1/node_modules/grunt-collection/package.json

{
    "description": "subproject", 
    "version": "0.0.0",
    "name": "Lorem",
    "title": "Lorem Ipsum", 
    "dependencies": {
      "grunt-contrib-watch": "~0.2.0", 
      "grunt-contrib-jshint": "~0.1.1", 
      "grunt-contrib-less": "~0.5.0", 
      "grunt-contrib-uglify": "~0.1.1", 
      "grunt-contrib-copy": "~0.4.0", 
      "grunt-contrib-qunit": "~0.1.1", 
      "grunt-css": "~0.5.4", 
      "grunt-contrib-clean": "~0.4.0", 
      "grunt-html": "~0.3.3", 
      "grunt-contrib-concat": "~0.1.3"
    },
    "keywords": ["gruntcollection"]
}

关键是在每个子项目中创建一个只有 package.json 的小模块,其中包含keyword gruntcollectionGrunfile 使用的依赖项。

然后 Grunt 将使用相同的策略加载这些require,这意味着它们可以在node_modules您的父项目中找到。

警告:grunt 收集的工作方式是使用 package.json 的依赖标签,这意味着你不能使用 npm install 安装它,但你应该能够存储它的源代码控制。

于 2013-03-06T01:08:22.850 回答
1

我创建了一个 npm 模块load-grunt-parent-tasks来解决这个问题。它的灵感来自Pascal Belloncle给出的答案并使用了一个gruntcollectionhack。

你需要做的就是 require 模块,传递它grunt和一个配置对象,剩下的就交给它了。

module.exports = function(grunt) {

  require('load-grunt-parent-tasks')(grunt, {
    config: 'package.json',
    pattern: 'grunt-*',
    scope: 'dependencies',
    module: 'grunt-collection'
  });

};

您可以根据传递给的 globbing 模式过滤您想要加载的 grunt 任务pattern

您可以查看 Npm 上的模块:https ://www.npmjs.org/package/load-grunt-parent-tasks

于 2014-10-10T02:47:14.740 回答
1

另一个解决方案,在https://github.com/gruntjs/grunt/issues/696 module.exports = function (grunt) { grunt.file.expand('../node_modules/grunt-*/tasks').forEach(grunt.loadTasks); }

于 2015-10-09T09:51:48.003 回答
0

以下是一个简单的解决方法。更改 Gruntfile.js。 module.exports = function (grunt) { var cwd = process.cwd(); process.chdir(cwd+'/../'); require('matchdep').filterDev('grunt-*').forEach(grunt.loadNpmTasks); process.chdir(cwd); }

于 2015-10-09T09:28:14.570 回答