Условная компиляция в CoffeeScript / UglifyJS - PullRequest
11 голосов
/ 14 марта 2012

Используя Coffeescript, мне все равно нужно пройти скрипт сборки, чтобы обновить мои файлы .js, и у меня есть два из них, один для отладки и один для производства (один использует Uglify для минимизации файлов, другой нет) , Поэтому я подумал, что было бы удобно иметь некоторую условную компиляцию, с кодом, который входит только в отладочную сборку.

Какой самый простой способ добиться этого, в идеале управляемый простым переключателем командной строки, который я могу дать кофе или углифу?

Ответы [ 4 ]

7 голосов
/ 14 марта 2012

Если вы все равно пишете скрипт сборки, вы можете добавить к нему шаг препроцессора.Поскольку CoffeeScript использует # для обозначения комментариев, препроцессор C кажется хорошим выбором.Вы можете обозначить код отладки как #ifdef s:

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

Затем вы можете предварительно обработать версию отладки с помощью cpp -E -Xpreprocessor -DDEBUG <filename> -o <outfile> и скомпилировать <outfile> с CoffeeScript.Точно так же предварительно обработайте рабочую версию с помощью cpp -E <filename> -o <outfile>.

Редактировать: Это сложно, потому что это означает, что любые комментарии CoffeeScript, которые не имеют отступ, прервут шаг предварительной обработки.Не уверен, насколько это проблема для тебя.Например,

code...
#comment about the code

прервет сборку, но

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

будет работать нормально, потому что препроцессор не смотрит на строки, если их первый символ не является #.

2 голосов
/ 14 марта 2012

Мне кажется, вы говорите, что у вас есть два сценария сборки?Для 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()
1 голос
/ 15 марта 2012

Альтернативой препроцессору C может быть макропроцессор M4 ( Wikipedia intro ).Я не использовал его сам, поэтому не могу просмотреть его, и я знаю, что это должно быть чем-то вроде боли, но это решит вашу проблему.Кроме того, он, как и препроцессор C, работает на всех возможных ОС.

0 голосов
/ 02 июля 2016

Я использую 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
#...
...