tutorial serve run grunt dist cli node.js gruntjs node-modules

node.js - serve - Centralizar node_modules en proyecto con subproyecto



install grunt windows (4)

A continuación hay una solución simple. Cambiar Gruntfile.js. module.exports = function (grunt) { var cwd = process.cwd(); process.chdir(cwd+''/../''); require(''matchdep'').filterDev(''grunt-*'').forEach(grunt.loadNpmTasks); process.chdir(cwd); }

¿Es posible configurar el gruñido de manera que tenga los módulos necesarios en un punto central?

Tengo la siguiente estructura del proyecto

-Project -- subproject -- subproject -- subproject

Construyo el proyecto a través de grunt con todos los subproyectos, y también puedo construir cada subproyecto por sí mismo. Actualmente tengo un Gruntfile.js, package.json & folder node_modules (~ 50mb) con todos los módulos necesarios en cada subproyecto y en el nivel raíz.

Entonces, ¿es posible tener la carpeta node_modules solo en un nivel, por ejemplo, en el nivel raíz y los subproyectos se refieren a los node_modules en el nivel raíz?

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

¿Hay alguna forma de hacer referencia a la carpeta node_module a través de package.json o cualquier otra cosa?

Editar:

Gruntfile.js (nivel de subproyecto)

/*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 (subproejct level)

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


Creé un módulo npm load-grunt-parent-tasks offices para solucionar el problema. Se inspiró en la respuesta que dio y usa un truco de gruntcollection .

Todo lo que necesitas hacer es requerir el módulo, pasarlo grunt y un objeto de configuración y hará el resto.

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

Puede filtrar las tareas que le gustaría cargar según el patrón de globo que pase al pattern .

Puede consultar el módulo en Npm: load-grunt-parent-tasks


Esto funciona fuera de la caja. npm busca node_modules en el directorio actual y todos sus directorios principales, luego busca en la ubicación global.

Así que incluso podrías hacer esto:

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

subproject1 tendrá acceso a todos los npms dentro de Project/subproject1/node_modules subproject1 Project/subproject1/node_modules y Project/node_modules , mientras que subproject2 y subproject3 solo encontrarán aquellos dentro de Project/node_modules

Actualizar

Hay una característica muy poco documentada llamada colecciones de gruñidos. Requiere un poco de configuración, pero no necesitará una copia de todos los complementos de Grunt en cada subproyecto.

Aquí está el diseño del archivo

-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

Proyecto / paquete.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" } }

Proyecto / subproyecto1 / paquete.json

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

Extracto de Project / subproject1 / Gruntfile.js (solo necesita la tarea de recopilación de gruñidos).

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'');

Proyecto / subproyecto1 / 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"] }

La clave es crear en cada uno de sus subproyectos, un pequeño módulo con solo package.json que incluye la keyword gruntcollection e incluye las dependencias que usa su Grunfile.

Luego, Grunt los cargará utilizando la misma estrategia que require usos, lo que significa que se pueden encontrar en los node_modules de node_modules de su proyecto principal.

Advertencia: la forma en que funciona la colección de grunt mediante el uso de la etiqueta de dependencia de package.json, esto significa que no puede instalarlo con npm install, pero debe poder almacenar el control de código fuente.


Otra solución, que se encuentra en https://github.com/gruntjs/grunt/issues/696 module.exports = function (grunt) { grunt.file.expand(''../node_modules/grunt-*/tasks'').forEach(grunt.loadTasks); } module.exports = function (grunt) { grunt.file.expand(''../node_modules/grunt-*/tasks'').forEach(grunt.loadTasks); }