Kopieren Sie alle Dateien mit Grunt.js Kopie aus einem Verzeichnis in ein anderes

91

Ich versuche, alle Dateien in einem Verzeichnis als Teil meines Erstellungsprozesses in ein anderes Verzeichnis zu kopieren. Es funktioniert gut für einzelne Dateien, die ich explizit spezifiziere, aber wenn ich versuche, das gesamte Verzeichnis zu kopieren, macht es seltsame Dinge wie das Kopieren der vollständigen Verzeichnisstruktur (oder gar nichts). Hier ist der relevante Teil aus meiner 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/" }
    ]
  }
},

Insbesondere ist es die letzte Zeile, die ich nicht zur Arbeit bringen kann:

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

Antworten:

149

Die flatten: trueOption wie in dieser Antwort mag in einigen Fällen funktionieren, aber es scheint mir, dass die häufigere Anforderung (wie in meinem Fall) darin besteht, einen Ordner und seine Unterordnerstruktur unverändert zu kopieren dest. Es scheint, dass in den meisten Fällen, wenn Sie Unterordner haben, diese wahrscheinlich im Code auf diese Weise referenziert werden. Der Schlüssel dazu ist die cwdOption, mit der die Ordnerstruktur relativ zum angegebenen Arbeitsverzeichnis beibehalten wird:

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
  }
}
Brian Moeskau
quelle
Danke - Sie haben Recht, diese Antwort ist mehr das, wonach ich gesucht habe, als ich die Frage gestellt habe. Ich hatte gelernt, mit der durch die vorherige Antwort verursachten Abflachung umzugehen, aber es war ärgerlich.
Evan Hobbs
13
Ich habe über eine Stunde dafür verloren ... Wenn Sie cwdOptionen verwenden, müssen Sie sich umdrehen expand:true. Wenn Sie nicht einstellen expand:true, funktioniert cwd nicht richtig.
Ducin
2
Ich musste sicherstellen, dass die Verzeichnispfade mit '/' enden und hinzufügen flatten: false, damit dies funktioniert.
Samuel Rossille
**/* Das ist, wonach ich gesucht habe, was ich benutzt habe ** danke Mann.
Sam
43

Diese Aufgabe behält die Ordnerstruktur bei, wenn Sie einen Dateiglob angeben. Was Sie wollen, ist die flattenOption, mit der die Struktur entfernt wird.

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

Den Rest der verfügbaren Optionen finden Sie im Github-Repo . Hoffe das hilft.

Ben
quelle
24

Ich möchte hinzufügen, dass das Ändern des Formats des Globs in src die Funktionsweise der Kopie ändert.

Wie oben von bmoeskau ausgeführt , wird im Folgenden alles darin kopiert dist/und verschoben path/to/dir(das Ziel überschreiben, falls es bereits vorhanden ist).

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

Beachten Sie jedoch Folgendes:

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

Kopiert nur Dateien innerhalb dist/von Verzeichnissen, kopiert jedoch nicht den Inhalt dieser Verzeichnisse in das Ziel.

Im Folgenden src: '*/*'werden nur Verzeichnisse mit Inhalten kopiert dist/. Das heißt, Dateien, die sich gerade befinden, dist/werden nicht kopiert.

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

Schließlich wie oben, src: '**/**'kopiert jedoch nur Dateien innerhalb dist/sowie Dateien in dist/Unterverzeichnissen nach path/to/dir. Es werden also keine Ordner im Ziel vorhanden sein.

copy: {
  files: {
    expand: true,
    dest: 'path/to/dir',
    cwd: 'dist/',
    src: '*/*',
    flatten: true,
    filter: 'isFile'
  }
}
Jorge Bucaran
quelle
4
tolle Erklärung! +1
Myrocode
3
Besser als die Dokumentation auf Github, ich mag Beispiele
Wukong
+1 Gibt es eine Konvention darüber, was die Anzahl der Sterne bedeuten soll, bedeutet beispielsweise **immer Dateien und Verzeichnisse und *nur Dateien?
CodyBugstein
1
@Imray Aus dem Bash-Handbuch : Zwei benachbarte *s, die als einzelnes Muster verwendet werden, stimmen mit allen Dateien und null oder mehr Verzeichnissen und Unterverzeichnissen überein . Wenn gefolgt von a /, *stimmen zwei benachbarte s nur mit Verzeichnissen und Unterverzeichnissen überein .
Jorge Bucaran
1
**passt zu allem , während **/ nur Verzeichnisse und Unterverzeichnisse (keine Dateien).
Jorge Bucaran
1

Musste egdy statt geschweifte Klammern für das Dateisegment verwenden (in Coffeescript) ...

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

Wenn Sie mit eckigem Yeoman entwickeln, ist dies der bessere Weg, um mit Grunzen zu kopieren. expand: true ist erforderlich, wenn cwd verwendet wird. <% = yeoman.app%> ist nur die App-Route ('.').

 {
    expand: true,
     cwd: '<%= yeoman.app %>/data',
     dest: '<%= yeoman.dist %>/data',
     src: ['**']
    }
Heute lernen
quelle
Während dieses Code-Snippet die Frage lösen kann, hilft das Hinzufügen einer Erklärung wirklich, die Qualität Ihres Beitrags zu verbessern. Denken Sie daran, dass Sie die Frage für Leser in Zukunft beantworten und diese Personen möglicherweise die Gründe für Ihren Codevorschlag nicht kennen. Bitte versuchen Sie auch, Ihren Code nicht mit erklärenden Kommentaren zu überfüllen, da dies die Lesbarkeit sowohl des Codes als auch der Erklärungen beeinträchtigt!
Auf Wiedersehen StackExchange