使用Coffeescript我需要经历一个构建脚本来更新我的.js文件,我有两个,一个用于调试,一个用于生产(一个使用Uglify来最小化文件,一个不使用)。因此我认为使用一些条件编译也很方便,代码只能进入调试版本。
实现这一目标的最简单方法是什么?理想情况下,我可以通过简单的命令行开关来控制咖啡或uglify?
使用Coffeescript我需要经历一个构建脚本来更新我的.js文件,我有两个,一个用于调试,一个用于生产(一个使用Uglify来最小化文件,一个不使用)。因此我认为使用一些条件编译也很方便,代码只能进入调试版本。
实现这一目标的最简单方法是什么?理想情况下,我可以通过简单的命令行开关来控制咖啡或uglify?
如果您正在编写构建脚本,则可以向其添加预处理器步骤。自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
将正常工作,因为除非第一个字符是a,否则预处理器不会查看行 #
。
如果您正在编写构建脚本,则可以向其添加预处理器步骤。自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
将正常工作,因为除非第一个字符是a,否则预处理器不会查看行 #
。
听起来像你说你有两个构建脚本?对于 string.js,我只是使用Cakefile来实现你想要的东西。实质上,如果源文件发生更改,它会生成一个常规JS文件,然后生成一个uglified文件。
这是相关部分 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()
我用 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
#...