2013-09-23 141 views
84

我試圖將目錄中的所有文件複製到另一個目錄作爲我的構建過程的一部分。它適用於我明確指定的單個文件,但是當我嘗試複製整個目錄時,它會執行奇怪的操作,例如複製完整的目錄結構(或根本沒有任何內容)。下面是相關的部分從我GruntFile.js:使用Grunt.js複製目錄中的所有文件到另一個複製

copy: { 
    myvoice: { 
    files: [ 
     { src:"src/html/index.html", dest:"dist/myvoice/index.html" }, 
     { src:"src/html/css/style.css", dest:"dist/myvoice/css/style.css" }, 
     { src:"src/html/js/require.js", dest:"dist/myvoice/js/require.js" }, 
     { src:"build/myvoice/main.js", dest:"dist/myvoice/js/main.js" }, 
     { src:"src/html/css/fonts/*", dest:"dist/myvoice/css/fonts/" } 
    ] 
    } 
}, 

具體來說它的最後一行,我不能去上班:

 { src:"src/html/css/fonts/*", dest:"dist/myvoice/css/fonts/" } 

回答

138

flatten: true選項,如this answer可能會爲某些情況下工作,但在我看來,更多的共同要求(如在我的情況)是一個文件夾及其子文件夾結構複製,原樣,以dest 。看來在大多數情況下,如果你有子文件夾,他們可能在代碼中被這樣引用。到這樣做的關鍵是cwd選項,它相對的文件夾結構將保存到指定的工作目錄:

copy: { 
    files: { 
    cwd: 'path/to/files', // set working folder/root to copy 
    src: '**/*',   // copy all files and subfolders 
    dest: 'dist/files', // destination folder 
    expand: true   // required when using cwd 
    } 
} 
+0

謝謝 - 你是對的,這個答案更多的是當我問這個問題時我正在尋找的東西。我學會了處理前一個答案造成的扁平化,但它很煩人。 –

+12

我已經失去了一個多小時...如果你使用'cwd'選項,一定要把'expand:true'。如果你沒有設置'expand:true',cwd將無法正常工作。 – ducin

+2

我必須確保目錄路徑以'/'結尾並添加'flatten:false'才能使其工作。 –

42

此任務將保持文件夾結構,如果您指定的文件glob的。你想要的是flatten選項,它將刪除結構。

{ 
    expand: true, 
    flatten: true, 
    src: ['src/html/css/fonts/**'], 
    dest: 'dist/myvoice/css/fonts/', 
    filter: 'isFile' 
} 

查找Github repo中其餘的可用選項。希望這可以幫助。

22

我想補充一點,改變glob的格式SRC將修改如何複製作品。

正如指出的bmoeskau上面,下面將一切複製裏面dist/並將其移動到path/to/dir(覆蓋目標,如果它已經存在)。

copy: { 
    files: { 
    expand: true, 
    dest: 'path/to/dir', 
    cwd: 'dist/', 
    src: '**' 
    } 
} 

不過請注意,認爲:

copy: { 
    files: { 
    expand: true, 
    dest: 'path/to/dir', 
    cwd: 'dist/', 
    src: '*' 
    } 
} 

只會複製文件內dist/以及目錄,但這些目錄的內容將複製到目標。

此外,以下src: '*/*'將只有複製目錄與dist/內的內容。也就是說,dist/內的文件不會被複制。

copy: { 
    files: { 
    expand: true, 
    dest: 'path/to/dir', 
    cwd: 'dist/', 
    src: '*/*' 
    } 
} 

最後,與上面相同,但src: '**/**'將複製文件內dist/以及文件內dist/子目錄path/to/dir。因此目標中不會有文件夾。

copy: { 
    files: { 
    expand: true, 
    dest: 'path/to/dir', 
    cwd: 'dist/', 
    src: '*/*', 
    flatten: true, 
    filter: 'isFile' 
    } 
} 
+4

很好的解釋! +1 – myrocode

+2

比github上的文檔更好,我喜歡示例 – wukong

+0

+1是否有關於星星的數量應該表示的約定,例如'**'總是指文件和目錄,而'*'只是文件? – CodyBugstein

0

不得不使用egdy代替花括號來代替文件段(在Coffeescript中)...

copy: { 
    files: [ 
    cwd: 'path/to/files' 
    src: '**/*' 
    dest: 'dist/files' 
    expand: true 
    ] 
} 
0

如果你正在開發角度yeoman,那麼這是用grunt複製的更好方法。 expand:使用cwd時需要爲true。 <%= yeoman.app%>就是app路線('。')。

{ 
    expand: true, 
    cwd: '<%= yeoman.app %>/data', 
    dest: '<%= yeoman.dist %>/data', 
    src: ['**'] 
    } 
+0

雖然此代碼片段可能會解決問題,但[包括解釋](// meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers)確實有助於提高帖子的質量。請記住,您將來會爲讀者回答問題,而這些人可能不知道您的代碼建議的原因。也請儘量不要使用解釋性註釋來擠佔代碼,因爲這會降低代碼和解釋的可讀性! – FrankerZ

相關問題