是否可以以在中心点上具有所需模块的方式配置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(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
答案 0 :(得分:6)
这开箱即用。 npm
在当前目录中查找node_modules
及其所有父目录,然后在全局位置查找。
所以你甚至可以这样做:
-Project
--subproject1
---node_modules
--subproject2
--subproject3
--node_modules
subproject1
可以访问Project/subproject1/node_modules
和Project/node_modules
中的所有npms,而subproject2
和subproject3
只能查找Project/node_modules
<内的所有内容/ p>
有一个很少记录的功能,称为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"
}
}
<强>项目/ 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');
<强>项目/ subproject1 / node_modules /咕噜收集/的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
gruntcollection
并包含Grunfile使用的依赖项。
然后Grunt将使用相同的策略加载require
,这意味着可以在父项目的node_modules
中找到它们。
警告:通过使用package.json的依赖标记,grunt集合的工作方式,这意味着您无法使用npm install安装它,但您应该能够存储它源代码控制。
答案 1 :(得分: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
的通配模式过滤要加载的grunt任务。
您可以在Npm查看模块:https://www.npmjs.org/package/load-grunt-parent-tasks
答案 2 :(得分:1)
https://github.com/gruntjs/grunt/issues/696中找到的另一种解决方案
module.exports = function (grunt) {
grunt.file.expand('../node_modules/grunt-*/tasks').forEach(grunt.loadTasks);
}
答案 3 :(得分:0)
以下是一个简单的解决方法。
更改Gruntfile.js。
module.exports = function (grunt) {
var cwd = process.cwd();
process.chdir(cwd+'/../');
require('matchdep').filterDev('grunt-*').forEach(grunt.loadNpmTasks);
process.chdir(cwd);
}