web-dev-qa-db-fra.com

Copier tous les fichiers d'un répertoire à un autre avec une copie de Grunt.js

J'essaie de copier tous les fichiers d'un répertoire dans un autre répertoire dans le cadre de mon processus de construction. Cela fonctionne bien pour des fichiers individuels que je spécifie explicitement, mais lorsque j'essaie de copier le répertoire entier, cela fait des choses étranges, comme de copier la structure de répertoires complète (ou rien du tout). Voici la partie pertinente de mon 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/" }
    ]
  }
},

Plus précisément c'est la dernière ligne que je ne peux pas me rendre au travail:

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

Le flatten: true option comme dans cette réponse peut fonctionner dans certains cas, mais il me semble que l'exigence la plus courante (comme dans mon cas) est de copier un dossier et sa structure de sous-dossiers, comme- est, à dest. Il semble que dans la plupart des cas, si vous avez des sous-dossiers, ils sont probablement référencés de cette façon dans le code. La clé pour ce faire est l'option cwd, qui préservera la structure des dossiers relative au répertoire de travail spécifié:

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
  }
}
144
Brian Moeskau

Cette tâche conservera la structure des dossiers si vous spécifiez un fichier glob. Ce que vous voulez, c'est l'option flatten qui supprimera la structure.

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

Trouvez le reste des options disponibles dans le rapport Github . J'espère que cela t'aides.

43
Ben

Je voudrais ajouter que changer le format de glob dans src modifiera le fonctionnement de la copie.

Comme souligné par bmoeskau ci-dessus, ce qui suit va copier tout à l'intérieur de dist/ Et le déplacer vers path/to/dir (écrasant la destination si elle existe déjà).

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

Notez cependant que:

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

Copiera uniquement les fichiers de dist/ Ainsi que les répertoires, mais ne copiera pas le contenu de ces répertoires dans la destination.

En outre, ce qui suit avec src: '*/*' Ne que copie les répertoires dont le contenu est contenu dans dist/. C'est-à-dire que les fichiers situés à l'intérieur de dist/ Ne seront pas copiés.

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

Enfin, comme ci-dessus, mais src: '**/**' Copie ( uniquement les fichiers contenus dans dist/ Ainsi que les fichiers contenus dans les sous-répertoires dist/ Dans path/to/dir. Donc, il n'y aura pas de dossiers à l'intérieur de la destination.

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

Il a fallu utiliser egdy à la place d'accolades pour le segment de fichiers (dans Coffeescript) ...

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

Si vous développez avec angular yeoman, c’est le meilleur moyen de copier avec grunt. Expand: true est requis pour l’utilisation de cwd. <% = Yeoman.app%> n’est que le chemin de l’application. ('.').

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