2014-06-06 65 views
0

我對Grunt相當陌生。我試圖從一個位置複製每個子目錄,並將每個子目錄放在另一個目標目錄中。我在一個自定義的grunt任務中這樣做,因爲我無法確定源位置中將存在多少個子目錄。我面臨的問題是每次執行副本時,前面的目錄結構都會被覆蓋。Grunt Copy任務將覆蓋目標父目錄

我已經嘗試將「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等。

謝謝!

回答

0

對不起回答我自己的問題,但我最初對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' 的所有子目錄。