复制任务覆盖目标父目录

Grunt Copy task overwrites destination parent directory

本文关键字:目标 任务 覆盖 复制      更新时间:2023-09-26

我对Grunt相当陌生。我试图从一个位置复制每个子目录,并将每个放在另一个目标目录。我在自定义grunt任务中执行此操作,因为我无法确定源位置中将存在多少个子目录。我面临的问题是,每次执行复制时,前面的目录结构都会被覆盖。

我已经尝试将'cwd'设置为我正在复制的子目录的根目录,但问题仍然存在。

文件夹结构:

container
     |
      - dist/  *I want to copy each src folder here
     |
     GruntFile.js
subapps
     |
      - thing1/dist
     |            *I want to copy each of these dirs (thing1/dist, thing2/dist) to container/dist eg: container/dist/thing1/dist, container/dist/thing2/dist
      - thing2/dist

我的任务:

grunt.registerTask('copySubApps', function () {
grunt.file.expand({filter : 'isDirectory'}, '../subapps/*/').forEach(function (subapp) {
  var subAppName = path.basename(subapp);
  var subAppDest = grunt.template.process('dist/subapps/<%= appName %>/dist/',{data:{appName:subAppName}});
  grunt.config('subAppDest', subAppDest);
  grunt.config('subAppName', subAppName);
  grunt.task.run('copy:subapp');
});

});配置:

copy: {
  subapp: {
    expand: true,
    src: '**/*',
    dest: '<%= subAppDest %>',
    cwd: '../subapps/<%= subAppName %>/dist'
  }
}

每个后续副本将覆盖前一个副本。我该如何避免这种情况?我相信这是一个相当幼稚的方法,所以建议和指导是非常受欢迎的。:-)一旦这是工作,我需要进一步过滤从每个子文件夹复制的项目。例如subapps/thing1/style, !subapps/thing1/common等

谢谢!

很抱歉回答我自己的问题,但我最初对Grunt任务配置的理解是缺乏的。希望这可以帮助那些正在努力理解如何动态创建任务目标的人。

这是我想到的:

    grunt.file.expand({filter: 'isDirectory'}, '../subapps/*/').forEach(function (subapp) {
      var subAppName = path.basename(subapp);
      var subAppDest = grunt.template.process('dist/subapps/<%= appName %>/', {data: {appName: subAppName}});
      var distWorkingDir = grunt.template.process('../subapps/<%= appName %>/', {data: {appName: subAppName}});
      var templatesWorkingDir = grunt.template.process('../subapps/<%= appName %>/src/', {data: {appName: subAppName}});
      //add a copy target for each subApp dir
      var distTarget = subAppName + '_dist';
      var templateTarget = subAppName + '_template';
      subAppTargetNames.push('copy:' + distTarget);
      subAppTargetNames.push('copy:' + templateTarget);
      subAppTargets.copy[distTarget] = {
        expand: true,
        src: 'dist/*',
        dest: subAppDest,
        cwd: distWorkingDir
      };
      subAppTargets.copy[templateTarget] = {
        expand: true,
        src: 'templates/*',
        dest: subAppDest,
        cwd: templatesWorkingDir
      };
    });
    //Merge new copy targets with existing copy configuration.
    grunt.config.merge(subAppTargets);
//Run each of the newly created copy targets
    grunt.task.run(subAppTargetNames);
  });

上面的代码基本上是这样做的:

  1. 查找'subapps'的所有子目录。