11

Coffeescript を使用して .js ファイルを更新するには、とにかくビルド スクリプトを実行する必要があります。1 つはデバッグ用、もう 1 つは本番用です (1 つは Uglify を使用してファイルを最小化し、もう 1 つは使用しません)。そのため、デバッグビルドにのみ入るコードで、条件付きコンパイルもあると便利だと考えていました。

これを達成する最も簡単な方法は何ですか?理想的には、コーヒーまたは醜いのいずれかに与えることができる単純なコマンドラインスイッチによって制御されますか?

4

4 に答える 4

7

とにかくビルド スクリプトを作成している場合は、それにプリプロセッサ ステップを追加できます。CoffeeScript#はコメントを表すために使用されるため、C プリプロセッサが適切な選択のように思えます。#ifdefsを使用してデバッグ コードを示すことができます。

some code...
#ifdef DEBUG
debug code...
#endif

その後、 CoffeeScriptを使用してデバッグ バージョンを前処理しcpp -E -Xpreprocessor -DDEBUG <filename> -o <outfile>、コンパイルできます。<outfile>同様に、製品バージョンを で前処理しcpp -E <filename> -o <outfile>ます。

編集: インデントされていないCoffeeScriptコメントが前処理ステップを中断することを意味するため、これは難しいです。これがあなたにとってどれほどの問題かはわかりません。例えば、

code...
#comment about the code

ビルドは壊れますが、

code...
  indented code...
  #indented comment

最初の文字が#.

于 2012-03-14T14:31:02.043 に答える
2

2つのビルドスクリプトがあると言っているように聞こえますか?string.jsの場合、私はCakefileを使用して、あなたが望むと思うことを実現します。基本的に、ソースファイルが変更されると、通常のJSファイルが生成され、次に醜いファイルが生成されます。

Cakefileの関連部分は次のとおりです。

 task 'watch', 'Watch src/ for changes', ->
    browserTestFile = path.join(process.cwd(), 'test_browser', 'string.test.js')

    coffee = spawn 'coffee', ['-w', '-c', '-o', 'lib', 'src']
    coffee.stderr.on 'data', (data) -> 'ERR: ' + process.stderr.write data.toString()
    coffee.stdout.on 'data', (data) ->
      d = data.toString()
      if d.indexOf('compiled') > 0
        #invoke 'test'

        fsw = fs.createWriteStream(browserTestFile, flags: 'w', encoding: 'utf8', mode: 0666)
        coffee_test = spawn 'coffee', ['-c', '-p', 'test/string.test.coffee']
        coffee_test.stdout.pipe(fsw, end: false)

        uglify = spawn 'uglifyjs', ['lib/string.js']
        uglify.stdout.pipe(fs.createWriteStream('lib/string.min.js'))

      else
        growl(d, title: 'Error', image: './resources/error.png')

      process.stdout.write data.toString()
于 2012-03-14T02:58:52.650 に答える
1

C プリプロセッサに代わるものは、M4 マクロ プロセッサです ( Wikipedia のイントロ)。私はそれを自分で使用したことがないので、レビューすることはできません. また、C プリプロセッサと同様に、考えられるすべての OS で実行されます。

于 2012-03-15T08:29:47.657 に答える
0

この種のことにはhttps://github.com/jsoverson/grunt-preprocessを使用します。それは私がやろうとしていることと正確に一致します:

detect_ennemy_collision: (ennemies) ->

# @ifdef DEBUG 
    expect(ennemies).to.be.an 'array'
    expect(ennemies.length).to.be.ok

    for ennemy in ennemies
        (expect ennemy).to.be.an.instanceof Character

# @endif
#...
于 2016-07-02T18:45:29.473 に答える