Grunt:在不同的文件夹上有package.json和Gruntfile.js

时间:2016-10-06 21:24:43

标签: javascript node.js npm gruntjs

我在尝试在不同的文件夹上实现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

有什么想法吗?提前谢谢

2 个答案:

答案 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.jspackage.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