web-dev-qa-db-ja.com

Grunt.jsコピーを使用して、ディレクトリからすべてのファイルを別のディレクトリにコピーします

ビルドプロセスの一環として、ディレクトリ内のすべてのファイルを別のディレクトリにコピーしようとしています。明示的に指定した個々のファイルに対しては正常に機能しますが、ディレクトリ全体をコピーしようとすると、ディレクトリ構造全体をコピーする(またはまったくコピーしない)などの奇妙なことをします。 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/" }
    ]
  }
},

具体的には、私が仕事をすることができない最後の行です:

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

この答え のようなflatten: 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
  }
}
144
Brian Moeskau

ファイルグロブを指定すると、このタスクはフォルダー構造を維持します。必要なのは、構造を削除するflattenオプションです。

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

Githubリポジトリ で利用可能な残りのオプションを見つけます。お役に立てれば。

43
Ben

glob insrcの形式を変更すると、コピーの動作が変更されることを追加したいと思います。

上記のbmoeskauで指摘したように、次のコードはeverythingdist/内にコピーして移動します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/およびディレクトリ内のファイルのみをコピーしますが、notはそれらのディレクトリの内容を宛先にコピーします。

また、次のsrc: '*/*'を使用すると、onlydist/内のコンテンツを含むディレクトリをコピーします。つまり、dist/のすぐ内側のファイルはコピーされません。

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

最後に、上記と同じですが、src: '**/**'は、dist/内のファイルとdist/内のファイルのみをコピーしますonlypath/to/dirへのサブディレクトリ。そのため、宛先内にフォルダーはありません。

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

(Coffeescriptの)ファイルセグメントに代わりに中括弧を使用する必要がありました...

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

angular yeomanで開発している場合、これはgruntでコピーするより良い方法です。 expand:cwdを使用する場合はtrueが必要です。 <%= yeoman.app%>は単なるアプリルート( '。')です。

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