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