Javascript 使用Grunt.js Copy将所有文件从目录复制到另一个目录
作为构建过程的一部分,我正在尝试将一个目录中的所有文件复制到另一个目录。对于我明确指定的单个文件,它工作得很好,但是当我尝试复制整个目录时,它会做一些奇怪的事情,比如复制完整的目录结构(或者什么都不复制)。以下是我的Grunfile.js中的相关部分:Javascript 使用Grunt.js Copy将所有文件从目录复制到另一个目录,javascript,gruntjs,Javascript,Gruntjs,作为构建过程的一部分,我正在尝试将一个目录中的所有文件复制到另一个目录。对于我明确指定的单个文件,它工作得很好,但是当我尝试复制整个目录时,它会做一些奇怪的事情,比如复制完整的目录结构(或者什么都不复制)。以下是我的Grunfile.js中的相关部分: copy: { myvoice: { files: [ { src:"src/html/index.html", dest:"dist/myvoice/index.html" }, { src:"src/htm
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/" }
如果您指定文件glob,此任务将保持文件夹结构。您需要的是
展平
选项,该选项将删除该结构
{
expand: true,
flatten: true,
src: ['src/html/css/fonts/**'],
dest: 'dist/myvoice/css/fonts/',
filter: 'isFile'
}
在中查找其余可用选项。希望这有帮助。中的
展平:true
选项可能适用于某些情况,但在我看来,更常见的要求(如我的情况)是将文件夹及其子文件夹结构复制到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
}
}
我想补充一点,更改src中的格式将修改副本的工作方式 正如上面bmoeskau所指出的,以下程序将复制
dist/
中的所有内容,并将其移动到path/to/dir
(如果目标已存在,则覆盖该目标)
然而,请注意:
copy: {
files: {
expand: true,
dest: 'path/to/dir',
cwd: 'dist/',
src: '*'
}
}
将仅复制dist/
内的文件以及目录,但不会将这些目录的内容复制到目标
copy: {
files: {
expand: true,
dest: 'path/to/dir',
cwd: 'dist/',
src: '*/*',
flatten: true,
filter: 'isFile'
}
}
此外,以下带有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'
}
}
不得不使用egdy代替大括号来表示文件段(在Coffeescript中)
如果您使用angular yeoman进行开发,那么这是使用grunt进行复制的更好方法。 expand:true在使用cwd时是必需的。只是应用程序路径('.')
{
是的,
cwd:“/data”,
dest:“/data”,
src:['**']
}
谢谢——你说得对。这个答案正是我问这个问题时想要的答案。我已经学会了处理前面的答案导致的扁平化,但这很烦人。我为此损失了一个多小时。。。如果使用cwd
选项,请确保打开expand:true
。如果您不设置扩展:true
,cwd将无法正常工作。我必须确保目录路径以“/”结尾,然后添加展平:false
,以使其正常工作。***
这就是我正在寻找的内容,我正在使用**谢谢你。非常好的解释+1与github上的文档相比,我喜欢示例+1是否有关于星星数的约定,例如**
是否总是指文件和目录,和*
仅文件?@Imray来自:作为单个模式使用的两个相邻的*
将匹配所有文件以及零个或多个目录和子目录。如果后面跟一个/
,两个相邻的*
将只匹配目录和子目录。***
匹配所有内容,而***//code>只匹配目录和子目录(而不是文件)。虽然此代码片段可以解决问题,但确实有助于提高文章的质量。请记住,您将在将来回答读者的问题,这些人可能不知道您的代码建议的原因。还请尽量不要用解释性注释挤满您的代码,因为这会降低代码和解释的可读性!
copy: {
files: [
cwd: 'path/to/files'
src: '**/*'
dest: 'dist/files'
expand: true
]
}
{
expand: true,
cwd: '<%= yeoman.app %>/data',
dest: '<%= yeoman.dist %>/data',
src: ['**']
}