2

私が書いている Chrome 拡張機能の Coffeescript をコンパイルするために rake を使用しています。

私のRakefileは次のようになります:

COFFEE = FileList['src/*.coffee']
JS = COFFEE.ext 'js'

directory 'extension'

rule '.js' => ['.coffee', 'extension'] do |t|
  `coffee -c -o extension #{t.source}`
end

desc "Build the extension in the 'extension' directory"
task :build => ['extension', JS] do
  cp File.join('src', 'manifest.json'), 'extension'
end

.coffeeディレクトリにファイルが 1 つしかない場合srcは問題ありません。しかし、複数の.coffeeファイルがあるとすぐにエラーになります:

$ rake build
> rake aborted!
> Don't know how to build task 'src/app.js src/background.js'
>
> Tasks: TOP => build
> (See full trace by running task with --trace)

FileListを依存関係として指定することは可能ですか? ビルド タスク中にすべての Coffeescript ファイルをコンパイルすることを rake に伝えるには、他にどのような方法がありますか?

4

4 に答える 4

8

Rakeの依存関係リストは、タスク名の配列です。FileListをその要素の1つとして使用する場合、配列をネストします–事実上、これは次のとおりです。

task :build => ['extension', ['src/app.js', 'src/background.js']] do

Rakeは、渡されたすべての依存関係配列要素の文字列表現を使用するだけです。そのため、'src/app.js src/background.js'タスクを作成できないと文句を言います(これが1つの文字列であることに注意してください)。

FileListをスプラットする(または依存関係配列をフラット化する)と、問題が解決します。つまり、次のようになります。

task :build => ['extension', *JS] do

また

task :build => ['extension', JS].flatten do
于 2013-01-26T22:00:09.283 に答える
1

これを試して:

files = Dir.entries('path/to/scripts').select { |f| f.include? '.coffee' }
files.each do |file_path|
  `coffee -c -o extension #{file_path}`
end
于 2013-01-25T20:03:05.017 に答える
0

これまでのところ、私の検索では、私が望むことを達成する唯一の方法は、私のものをループしてFileListそれぞれを明示的にコンパイルするタスクを持つことです(@nicoogaからの回答のように)。または、 内のすべてをループしてFileList、依存関係としてビルド タスクに追加することもできます。

ファイルのグループを取得するための 、ファイルの種類を処理する方法を定義するための 、および依存関係を定義するための優れた構文があるため、これらのいずれも好きではありませんが、これら 3 つすべてを組み合わせる方法は明らかにありませrakeん。FileListrule

したがって、現時点での私の解決策は、各ファイルを依存関係として追加する 2 番目のオプションを使用することです。これを行うために私が見つけた最短の方法は、依存関係配列にアクセスすることですconcatFileListしたがって、私のビルドタスクは次のようになります。

task :build => ['extension'].concat(JS) do
  cp File.join('src', 'manifest.json'), 'extension'
end

@kopischke のコメントのおかげで、これは splat['extension' *JS]演算子を使用して短縮することもできます。

于 2013-01-26T07:37:39.573 に答える