0

これはGrunt.jsを使用した動的ファイル マッピングに関する一般的な質問ですが、例として、動的構造を持つプロジェクトでコーヒーファイルを作成しようとします。

構造

ここでは、深さが異なる複数の (動的) ターゲット フォルダーを使用できます。コーヒーファイルを見つけるのは簡単で、**/coffee/*.coffeeいつでも一致します。

私が達成しようとしているのは、一致したコーヒーファイルに関連するdestプロパティを作成することです:

  • 探す**/coffee/*.coffee
  • にコンパイルする../js/*.js

プロジェクト フォルダー (Gruntfile) に対して相対にする代わりに。

coffee: {
    compile: {
        files: [
            {
              expand: true,
              src: ['**/coffee/*.coffee'],
              dest: '../js/', // This won't work ! But I wish it could :)
              ext: '.js'
            }
        ]
    }
}

どのようにこれを達成しますか?

4

1 に答える 1

6

それはあまり良い考えではないと思います。各ターゲットは、おそらく独自のリポジトリであるべきだと思われます。それを無視しても、ターゲット フォルダーと非ターゲット フォルダーを区別するのが難しいなど、他の問題が発生します。たとえば、現在のパターンはnode_modules/ディレクトリ内の CoffeeScript ファイルと一致する可能性があります。

また、ターゲットのフォルダー構造が異なる (つまり、同じレベルにない) ことも奇妙に感じcoffee/ますjs/。繰り返しますが、それらは異なるプロジェクトであり、独自のリポジトリを持つ必要があるようです。

そうは言っても、本当にそのようにしなければならない場合は、これを達成する方法がいくつかあります。

まず、それを行う「通常の」方法は、複数のターゲットを手動で指定することです。Gruntfile.coffeeここでは次の構文を使用します。

coffee:
  target1:
    expand: true
    cwd: 'target1/coffee'
    src: '**/*.coffee'
    dest: 'target1/js'
    ext: '.js'
  targetX:
    expand: true
    cwd: 'targetX/some-folder/coffee'
    src: '**/*.coffee'
    dest: 'targetX/some-folder/js'
    ext: '.js'

ただし、動的ターゲットが必要であり、不要なフォルダーをブラックリストに登録することを気にしない場合は、おそらく次のようなことを試してください。

coffee: do ->
  targets = {}
  for target in grunt.file.expand '**/coffee', '!node_modules/**'
    targets[target.split('/', 1)[0]] =
      expand: true
      cwd: target
      src: '**/*.coffee'
      dest: target + '/../js'
      ext: '.js'
  targets

これは基本的に前のスニペットと同じですが、いくつかの不確実性が追加されます。targets/フォルダーにすべてのターゲットを含め、targets/**/coffeeパターンとして 使用することで、おそらくブラックリストを取り除くことができます。

または、次を使用できますgrunt.file.expandMapping

coffee:
  compile:
    files: grunt.file.expandMapping ['**/coffee/**/*.coffee', '!node_modules/**'], '',
      expand: true
      ext: '.js'
      rename: (base, src) ->
        src.replace '/coffee/', '/js/'

シンプルな (そして醜い) ように見えるかもしれませんが、これは最も遅いオプションであり、最も間違っているように感じます。

そこで。それは可能ですが、おそらくあなたが本当に望んでいるものではありません。

于 2013-05-21T14:15:48.770 に答える