Estoy tratando de copiar todos los archivos de un directorio a otro directorio como parte de mi proceso de compilación. Funciona muy bien para los archivos individuales que yo especifique explícitamente, pero cuando intento copiar todo el directorio que hace cosas extrañas como copias de la estructura de directorios completa (o nada en absoluto). Aquí es la parte pertinente de mi GruntFile.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/" }
    ]
  }
},

Específicamente es la última línea que yo no puedo ir a trabajar:

      { src:"src/html/css/fonts/*", dest:"dist/myvoice/css/fonts/" }
InformationsquelleAutor Evan Hobbs | 2013-09-23

5 Comentarios

  1. 143

    La flatten: true opción como en esta respuesta podría funcionar para algunos casos, pero a mí me parece que el más común de los requisito (como en mi caso) es copiar una carpeta y sus subcarpetas de la carpeta de la estructura, tal como es, a dest. Parece que en la mayoría de los casos, si usted tiene sub-carpetas, que son, probablemente, a la que hace referencia esa manera en el código. La clave para hacer esto es el cwd opción, que preserve la estructura de la carpeta relativa al directorio de trabajo especificado:

    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
      }
    }
    • Gracias — tienes razón, esta respuesta es más de lo que yo estaba buscando cuando me hizo la pregunta. Yo había aprendido a manejar el aplanamiento causada por la respuesta anterior, pero era molesto.
    • He perdido más de una hora para esto… Si uso cwd opciones, asegúrese de apagar expand:true. Si no expand:true, cwd no funcionará correctamente.
    • Tenía que asegurarse de que las rutas de directorio terminar con ‘/’ y añadir flatten: false para conseguir este trabajo.
    • **/* Eso es lo que estaba buscando yo estaba usando ** gracias hombre.
  2. 43

    Esta tarea será mantener la estructura de carpetas si se especifica un archivo de glob. Lo que quiero es que el flatten opción para eliminar la estructura.

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

    Encontrar el resto de las opciones disponibles en el Repo de Github. Espero que esto ayude.

  3. 23

    Me gustaría añadir que cambiar el formato de la glob en src va a modificar la forma en que la copia de obras.

    Como se ha señalado por bmoeskau anterior, el siguiente será copiar todo dentro de dist/ y moverlo a path/to/dir (sobrescribiendo el destino si ya existe).

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

    Sin embargo, observe que:

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

    Sólo copia los archivos dentro de dist/ así como directorios, pero no copiar el contenido de los directorios para el destino.

    También, la siguiente con src: '*/*' se sólo copiar directorios con contenido dentro de dist/. Es decir, los archivos de justo dentro de dist/ no se copiarán.

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

    Finalmente, igual que el anterior, pero src: '**/**' se copia sólo archivos dentro de dist/ así como los archivos dentro de dist/ subdirectorios para path/to/dir. Así que no habrá ningún carpetas dentro del destino.

    copy: {
      files: {
        expand: true,
        dest: 'path/to/dir',
        cwd: 'dist/',
        src: '*/*',
        flatten: true,
        filter: 'isFile'
      }
    }
    • gran explicación! +1
    • mejor que la documentación en github, me gusta ejemplos
    • +1 hay una convención en lo que el número de estrellas debe significar, por ejemplo, hace ** siempre significa que los archivos y directorios, y * sólo los archivos?
    • De la manual de bash: dos adyacentes *s usado como un único patrón coincidirá con todos los archivos y cero o más directorios y subdirectorios. Si es seguido por una /, dos adyacentes *s coincidirá con sólo los directorios y subdirectorios.
    • ** coincide con todo, mientras que **/ sólo directorios y subdirectorios (no los archivos).
  4. 0

    Tenido que utilizar egdy en lugar de las llaves de los archivos del segmento (en Coffeescript)…

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

    Si está desarrollando con angular yeoman , entonces esta es la mejor manera de copiar con grunt.
    ampliar: true es necesaria cuando se utiliza cwd. <%= yeoman.aplicación de la %> es sólo la aplicación de ruta (‘.’).

     {
        expand: true,
         cwd: '<%= yeoman.app %>/data',
         dest: '<%= yeoman.dist %>/data',
         src: ['**']
        }
    • Mientras este fragmento de código se puede resolver la cuestión, , incluyendo una explicación de realmente ayuda a mejorar la calidad de tu post. Recuerde que usted está respondiendo a la pregunta para los lectores en el futuro, y esas personas pueden no saber las razones de su sugerencia de código. Por favor trate de no entrar en su código con comentarios explicativos, ya que esto reduce la legibilidad del código y las explicaciones!

Dejar respuesta

Please enter your comment!
Please enter your name here