17

必要なモジュールを中央に配置する方法でgruntを構成することは可能ですか?

私は次のプロジェクト構造を持っています

-Project
-- subproject
-- subproject
-- subproject

私はすべてのサブプロジェクトでgruntを介してプロジェクトを構築し、各サブプロジェクトをそれ自体で構築することもできます。現在、Gruntfile.js、package.json、フォルダーnode_modules(〜50mb)があり、各サブプロジェクトとルートレベルに必要なすべてのモジュールがあります。

では、node_modulesフォルダーを1つのレベルだけに置くことは可能ですか?たとえば、ルートレベルで、サブプロジェクトはルートレベルの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、mybecks

4

4 に答える 4

6

これは箱から出して動作します。 現在のディレクトリとそのすべての親ディレクトリを検索してから、グローバルな場所を検索しますnpmnode_modules

だからあなたもこれを行うことができます:

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

subproject1Project/subproject1/node_modulesおよび内のすべてのnpmにアクセスできますが、内のすべてのnpmProject/node_modulesのみが検索されsubproject2ますsubproject3Project/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

Project / 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"
    }
}

Project / subproject1 / 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');

Project / subproject1 / 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"]
}

keyword gruntcollection重要なのは、各サブプロジェクトで、 Grunfileが使用する依存関係を含むpackage.jsonだけの小さなモジュールを作成することです。

次に、Gruntは、同じ戦略の使用を使用してこれらをロードします。つまり、親プロジェクトrequireので見つけることができます。node_modules

警告:package.jsonの依存関係タグを使用したgruntコレクションの動作方法。これは、npm installではインストールできないことを意味しますが、ソース管理を保存できるはずです。

于 2013-03-06T01:08:22.850 に答える
1

問題を修正するためにnpm モジュールload-grunt-parent-tasksを作成しました。Pascal Belloncleが与えた答えに触発され、gruntcollectionハックを使用しています。

あなたがする必要があるのは、モジュールを要求し、gruntそれと構成オブジェクトを渡すことだけです。残りはそれが行います。

module.exports = function(grunt) {

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

};

に渡すグロビング パターンに基づいて、ロードする単調なタスクをフィルター処理できますpattern

モジュールは Npm で確認できます: https://www.npmjs.org/package/load-grunt-parent-tasks

于 2014-10-10T02:47:14.740 に答える
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 に答える