2013-03-07 112 views
50

我有以下結構:如何根據各個文件的父文件夾名稱使用Grunt重命名文件?

src/ 
    modules/ 
     module1/ 
      js/ 
       main.js 
      scss/ 
       main.scss 
      index.html 
     module2/ 
      js/ 
       main.js 
      scss/ 
       main.scss 
      index.html 

我想運行一個咕嚕任務,這些出複製到以下結構:

dev/ 
    js/ 
     module1.js 
     module2.js 
    css/ 
     module1.css 
     module2.css 
    module1.html 
    module2.html 

有沒有辦法用一個做到這一點現有的grunt插件?如果不是,我怎麼能做到這一點?

回答

84

這可以使用grunt-contrib-copy插件完成。

最重要的是要注意的是,您可以通過使用重命名函數(其中包含每個文件的目標和源)以編程方式更改目標。

這裏是一個(有點脆)樣品Gruntfile.js應該複製到所需的結構:

module.exports = function(grunt) { 
    // Project configuration. 
    grunt.initConfig({ 
    copy: { 
     main: { 
     files: [ 
      { 
      expand: true, 
      cwd: 'src/modules/', 
      src: ['**/*.js'], 
      dest: 'dev/js/', 
      rename: function(dest, src) { 
       // use the source directory to create the file 
       // example with your directory structure 
       // dest = 'dev/js/' 
       // src = 'module1/js/main.js' 
       return dest + src.substring(0, src.indexOf('/')) + '.js'; 
      } 
      }, 
      { 
      expand: true, 
      cwd: 'src/modules/', 
      src: ['**/*.scss'], 
      dest: 'dev/css/', 
      rename: function(dest, src) { 
       return dest + src.substring(0, src.indexOf('/')) + '.css'; 
      } 
      }, 
      { 
      expand: true, 
      cwd: 'src/modules/', 
      src: ['**/*.html'], 
      dest: 'dev/', 
      rename: function(dest, src) { 
       return dest + src.substring(0, src.indexOf('/')) + '.html'; 
      } 
      } 
     ] 
     } 
    } 
    }); 

    grunt.loadNpmTasks('grunt-contrib-copy'); 

    // Default task(s). 
    grunt.registerTask('default', ['copy']); 
}; 
+0

得到相反的情況:需要將文件從一個來源移動到不同的文件夾。你的回答解決了我的問題,謝謝! – kibin 2013-10-04 19:35:16

+4

在這裏還需要注意的是,如果你想在重命名時跳過某些文件,正確的返回值(默認)是'return dest +'/'+ src' - 這會導致文件被複制到默認位置。 – 2014-01-06 13:06:38

+0

@AlexeyKibin - 這也解決了你的問題。 – 2014-01-06 13:15:01

2

你可以簡單地使用的選項: 擴大:真實, 壓平:真

無需用於自定義重命名回調。

5

不需要使用grunt-contrib-copy就可以了,您現在可以利用grunt.file.expandMapping,該選項可以選擇僅更改文件擴展名,或定義返回輸出文件名的函數。

這裏有一個files對象的例子在jade任務編譯.jade模板導入的.html文件:

files: [{ 
    expand: true, 
    src: "**/*.jade", 
    dest: "<%= distDir %>", 
    cwd: "<%= assetsDir %>/jade", 
    rename: function(dest, matchedSrcPath, options) { 
     // return the destination path and filename: 
     return (dest + matchedSrcPath).replace('.jade', '.html'); 
    } 
}] 

這本來是更容易使用ext: '.html'選項而不是rename選項在這種情況下, ,但我在此處使用rename,以便您瞭解它是如何工作的。

有關grunt.file docsextrename(和其他)選項的更多信息。一些更多的例子herehere

0

不完全的回答你的問題,但我做到了在這裏尋找與咕嚕所以相對DEST文件夾...這是我如何解決它

... 
base: { 
    files: 
    [ 
    { 
     expand: true, 
     cwd: 'app/design/frontend/', 
     src: ['**/Magento_Sales/email-src/*.html'], 
     dest: '../../Magento_Sales/email/', 
     rename: function(dest, src, expand) { 
     src = path.parse(src) 
     return path.join(expand.cwd, src.dir, dest, src.base); 
     } 
    }, 
    ], 
} 
... 

這一點path.join(expand.cwd, src.dir, dest, src.base);只是創造我需要的道路。

expand.cwd = app/design/frontend/

src.dir = <DYNAMIC_FOLDERS>/Magento_Sales/email-src/

dest = ../../Magento_Sales/email/

src.base = <FILE>.html

,並一起吧= app/design/frontend/<COMPANY>/<MAIN-THEME>/Magento_Sales/email/<FILE>.html

,並在我的情況,現在可以編譯我的HTML電子郵件中相對目標文件夾