我在尝试在不同的文件夹上实现grunt时遇到了问题,在我的根目录中我有:
<root>/package.json
<root>/node_modules
在另一个文件夹中,我的gruntfile包含不同的子文件夹和我工作的文件:
<root>/apps/static/Gruntfile.js
如果我去root并执行
grunt --gruntfile /apps/static/Gruntfile.js MyTaskName
我明白了:
找不到本地Npm模块“grunt-contrib-concat”。它安装了吗?
找不到本地Npm模块“grunt-contrib-cssmin”。它安装了吗?
找不到本地Npm模块“grunt-contrib-clean”。它安装了吗?
找不到本地Npm模块“grunt-contrib-watch”。它安装了吗?
找不到本地Npm模块“grunt-contrib-uglify”。它安装了吗?
我运行了几次npm install。
在我的gruntfile.js上有
grunt.loadNpmTasks('grunt-contrib-concat');
grunt.loadNpmTasks('grunt-contrib-cssmin');
grunt.loadNpmTasks('grunt-contrib-clean');
grunt.loadNpmTasks('grunt-contrib-watch');
grunt.loadNpmTasks('grunt-contrib-uglify');
我三重检查和文件夹是可以的(事实上,最初的gruntfile和包在同一个文件夹中,一切都很完美,运行几个任务,一切都很好)。我真的需要在root上有一个公共的package.json和node_modules,在特定的项目文件夹上有一个Gruntfile.js
有什么想法吗?提前谢谢
答案 0 :(得分:2)
Grunt对gruntfile.js
的位置做出了一些假设。
使用gruntfile.js
选项指定--gruntfile
的位置时,将Grunt sets the current directory指定到包含指定文件的目录:
// Change working directory so that all paths are relative to the
// Gruntfile's location (or the --base option, if specified).
process.chdir(grunt.option('base') || path.dirname(gruntfile));
当Grunt加载NPM任务时,它会relative to the current directory:
var root = path.resolve('node_modules');
var pkgfile = path.join(root, name, 'package.json');
有一个--base
option可以指定当前目录,但是否能解决您的问题(不会引入其他问题)我不知道。最简单的解决方案可能是将gruntfile.js
定位在它想要和期望的位置。
答案 1 :(得分:0)
有时,可能需要项目将Gruntfile.js
与package.json
放在不同的文件夹中。
我有一个非常相似的用例,其中有多个子模块,每个子模块都有自己的构建过程,其中一个是Grunt。但同时,我想拥有一个公用的package.json
只是为了避免创建多个node_modules
文件夹,以便公用的依赖项(包括传递性)用于安装一次。它有助于减少安装时间和磁盘使用量。
我期待Grunt本身能提供解决方案。但是正如@cartant所说,Grunt做出了某些假设。
所以,这就是我所做的:
在Gruntfile.js
中,
定义一个功能:
function loadExternalNpmTasks(grunt, name) {
const tasksdir = path.join(root, 'node_modules', name, 'tasks');
if (grunt.file.exists(tasksdir)) {
grunt.loadTasks(tasksdir);
} else {
grunt.log.error('Npm module "' + name + '" not found. Is it installed?');
}
}
而不是
grunt.loadNpmTasks('grunt-contrib-concat');
这样做:
loadExternalNpmTasks(grunt, 'grunt-contrib-concat');
参考:https://github.com/gruntjs/grunt/blob/master/lib/grunt/task.js#L396