Centralizacja modułów węzła w projekcie za pomocą podprojektu

Czy można skonfigurować grunt w taki sposób, że wymagane moduły znajdują się w centralnym punkcie?

Mam następującą strukturę projektu

-Project
-- subproject
-- subproject
-- subproject

Buduję projekt poprzez grunt ze wszystkimi podprojektami i mogę zbudować każdy podprojekt dla siebie. Obecnie mam Gruntfile.js, paczka.json & folder node_modules (~50MB) ze wszystkimi wymaganymi modułami w każdym podprojekcie i na poziomie głównym.

Czy więc możliwe jest posiadanie katalogu node_modules tylko na jednym poziomie, dla np. na poziomie root i podprojekty odnoszą się do node_modules na poziomie root?

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

Czy istnieje sposób na odwołanie się do folderu node_module za pomocą pakietu.json czy coś jeszcze?

Edit:

Gruntfile.js (poziom podprojektu)

/*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']);
};

Pakiet.JSON (poziom subproejct)

{
    "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

Author: mybecks, 2013-03-05

4 answers

To działa po wyjęciu z pudełka. npm szuka node_modules w bieżącym katalogu i wszystkich jego katalogach nadrzędnych, a następnie szuka w lokalizacji globalnej.

Więc możesz nawet to zrobić:

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

subproject1 będzie miał dostęp do wszystkich npm wewnątrz Project/subproject1/node_modules i Project/node_modules, podczas gdy subproject2 i subproject3 znajdą tylko te wewnątrz Project/node_modules

Update

Istnieje bardzo niewiele udokumentowanych cech zwanych zbiorami Grunta. Wymaga trochę konfiguracji, ale nie będziesz potrzebował kopii wszystkich Twoje wtyczki grunt w każdym podprojektie.

Oto układ pliku

-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

Projekt / pakiet.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"
    }
}

Projekt / podproject1 / pakiet.json

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

Project / subproject1 / Gruntfile.js fragment (potrzebujesz tylko zadania 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"]
}

Kluczem jest stworzenie w każdym podprojektie małego modułu z paczka.json, który obejmuje keyword gruntcollection i zawiera zależności, których używa Twój Grunfile.

Grunt załaduje je używając tej samej strategii require, co oznacza, że można je znaleźć w node_modules twojego projektu nadrzędnego.

Zastrzeżenie: sposób, w jaki kolekcja grunt działa, używając znacznika zależności pakietu.json, oznacza to, że nie można go zainstalować za pomocą npm install, ale powinieneś być w stanie przechowywać kontrolę źródła.

 6
Author: Pascal Belloncle,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-03-06 19:33:59

Stworzyłem moduł npm load-grunt-parent-task, aby rozwiązać problem. Został zainspirowany odpowiedzią, którą dał Pascal Belloncle i używa hakera gruntcollection.

Wszystko, co musisz zrobić, to zażądać modułu, przekazać go grunt i obiekt config, a on zrobi resztę.

module.exports = function(grunt) {

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

};

Możesz filtrować zadania gruntowe, które chcesz załadować na podstawie wzorca globbingu, który przekazujesz pattern.

Możesz sprawdzić moduł na Npm: https://www.npmjs.org/package/load-grunt-parent-tasks

 1
Author: psyrendust,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:00:02

Inne rozwiązanie, Znalezione w https://github.com/gruntjs/grunt/issues/696 module.exports = function (grunt) { grunt.file.expand('../node_modules/grunt-*/tasks').forEach(grunt.loadTasks); }

 1
Author: geting,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-10-09 09:51:48

Poniżej znajduje się proste obejście. Zmień Plik Gruntfile.js. module.exports = function (grunt) { var cwd = process.cwd(); process.chdir(cwd+'/../'); require('matchdep').filterDev('grunt-*').forEach(grunt.loadNpmTasks); process.chdir(cwd); }

 0
Author: geting,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-10-09 09:28:14