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


91

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

回答:


149

この回答のようなflatten: trueオプションは場合によっては機能するかもしれませんが、(私の場合のように)より一般的な要件は、フォルダーとそのサブフォルダー構造をそのままにコピーすることです。ほとんどの場合、サブフォルダーがある場合、それらはコードでそのように参照されているようです。これを行うための鍵は、指定した作業ディレクトリに関連するフォルダー構造を保持するオプションです。destcwd

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
  }
}

よろしくお願いします。この答えは、私が質問したときに私が探していたものです。私は前の回答によって引き起こされたフラット化に対処することを学びましたが、それは迷惑でした。
エヴァンホッブズ2014年

13
私はこれのために1時間以上失っています... cwdオプションを使用する場合は、必ずをオンにしてくださいexpand:true。を設定しないとexpand:true、cwdは正しく機能しません。
ducin 14

2
これを機能させるには、ディレクトリパスが「/」で終わっていることを確認し、追加するflatten: false必要がありました。
Samuel Rossille、2014

**/* それは私が探していたものです**おかげで男を使用していました。
Sam

43

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

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

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


24

私はの形式に変化することを追加したいグロブをしてSRCはコピーがどのように機能するかを変更します。

上記のbmoeskauで指摘されているように、以下は内部にすべてをコピーしdist/移動し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/ディレクトリ内のファイルもコピーしますが、それらのディレクトリの内容を宛先にコピーしません

また、次のwith 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'
  }
}

4
素晴らしい説明!+1
myrocode

3
githubのドキュメントよりも良いので、例が好きです
wukong

+1星の数の意味についての規則がありますか。たとえば、**常にファイルとディレクトリを意味し、ファイルのみを意味し*ますか?
CodyBugstein、2015年

1
@Imray bashマニュアルから:*単一のパターンとして使用される2つの隣接するは、すべてのファイルと0個以上のディレクトリおよびサブディレクトリに一致します。が後に続く場合/、2つの隣接するは、ディレクトリとサブディレクトリのみ*に一致します。
ホルヘブカラン2015年

1
**すべてに一致しますが、ディレクトリとサブディレクトリ(ファイルではない)**/ のみが一致します
ホルヘブカラン、2015年

1

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

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

0

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

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

このコードスニペットは問題を解決する可能性がありますが、説明を含めると、投稿の品質を向上させるのに役立ちます。あなたは将来の読者のための質問に答えていることを覚えておいてください、そしてそれらの人々はあなたのコード提案の理由を知らないかもしれません。また、コードと説明の両方の読みやすさが低下するため、コードを説明コメントで混雑させないようにしてください。
さようならStackExchange
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.